深圳市建设网站黑河做网站哪家好
web/
2025/9/28 3:49:51/
文章来源:
深圳市建设网站,黑河做网站哪家好,中企做的网站,奉贤区网站建设本文涉及到定时器和串口的知识#xff0c;详细内容可见博主STM32速成笔记专栏。 文章目录 一、TB6612简介二、TB6612使用方法2.1 TB6612引脚连接2.2 控制逻辑2.3 电机调速 三、实战项目3.1 项目简介3.2 初始化GPIO3.3 PWM初始化3.3 电机控制程序3.4 串口接收处理函数 一、TB66… 本文涉及到定时器和串口的知识详细内容可见博主STM32速成笔记专栏。 文章目录 一、TB6612简介二、TB6612使用方法2.1 TB6612引脚连接2.2 控制逻辑2.3 电机调速 三、实战项目3.1 项目简介3.2 初始化GPIO3.3 PWM初始化3.3 电机控制程序3.4 串口接收处理函数 一、TB6612简介
TB6612FNG是东芝半导体的一款驱动电机的IC。一个TB6612FNG可以驱动两个电机每一个驱动都有两个逻辑输入引脚一个输出引脚和一个PWM引脚。可以通过给两个逻辑输入引脚不同的电平来控制电机的运行状态通过PWM输入引脚实现电机调速。TB6612FNG还具有以下特点
电源电压最大可到15V输出电流最大可达3.2A内置热停机电路和低压检测电路有正转反转短制动和停止四种模式 二、TB6612使用方法
2.1 TB6612引脚连接
引脚连接PWMAA通道的PWM输入AIN2A通道逻辑输入2引脚AIN1A通道逻辑输入1引脚STBY待机引脚接低电平处于待机模式接高电平开始工作BIN1B通道逻辑输入1引脚BIN2B通道逻辑输入2引脚PWMBB通道PWM输入引脚GND地VM电源输入正极最大接15VVCC逻辑电源正极接3.3VAO1A通道输出1引脚AO2A通道输出2引脚BO2B通道输出2引脚BO1B通道输出1引脚
使用时VM接电机电源的正极GND接电机电源的负极。IN1和IN2接逻辑输入PWM接PWM输出引脚。O1和O2接电机的正负极。
2.2 控制逻辑
IN1和IN2的高低电平状态对应不同的电机运行状态二者的对应关系如下
IN1001IN2010电机运行状态停止正转反转
上述的正反转是AO1接电机正极AO2接电机负极的对应关系。
2.3 电机调速
电机调速的远离比较简单只需要给TB6612FNG的PWM输入引脚输入10KHz的PWM波。调节占空比即可调节转速。需要注意的是如果PWM配置的极性是低电平那么设置占空比时的值越大电机转速越低。相反如果PWM配置的极性是高电平那么设置占空比时的值越大电机转速越高。
三、实战项目
3.1 项目简介
本项目比较简单使用TB6612驱动一个12V减速电机。利用串口发送占空比实现电机的调速。
3.2 初始化GPIO
初始化GPIO完成的工作是初始化逻辑控制引脚程序如下
/***函数名称Drv_MotorGpio_Init*函数功能初始化Motor的GPIO*输入参数无*返回值无*备 注这里只初始化了逻辑控制IOPWM的IO在定时器配置PWM时初始化**/
void Drv_MotorGpio_Init (void)
{GPIO_InitTypeDef GPIO_InitStructure; // 定义结构体// 开启时钟RCC_APB2PeriphClockCmd(MOTOR_GPIO_TIM,ENABLE);// 配置结构体GPIO_InitStructure.GPIO_Pin MOTOR_GPIO_PIN;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 推挽式输出GPIO_Init(MOTOR_GPIO, GPIO_InitStructure);
}宏定义如下
// 电机逻辑控制GPIO
#define MOTOR_GPIO_TIM RCC_APB2Periph_GPIOC
#define MOTOR_GPIO GPIOC
#define MOTOR_GPIO_PIN GPIO_Pin_7 | GPIO_Pin_83.3 PWM初始化
PWM初始化程序如下
/***函数名称TIM2_CH1_PWM_Init*函数功能初始化定时器2的PWM通道1*输入参数per自动重装载值psc预分频系数*返回值无*备 注无**/
void TIM2_CH1_PWM_Init (u16 per,u16 psc)
{// 结构体定义TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;GPIO_InitTypeDef GPIO_InitStructure;// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);// 初始化GPIOGPIO_InitStructure.GPIO_Pin GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; // 复用推挽输出GPIO_Init(GPIOA,GPIO_InitStructure);// 初始化定时器参数TIM_TimeBaseInitStructure.TIM_Period per; // 自动装载值TIM_TimeBaseInitStructure.TIM_Prescaler psc; // 分频系数TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; // 设置向上计数模式TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStructure); // 初始化PWM参数TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; // 比较输出模式TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; // 输出极性TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; // 输出使能TIM_OC1Init(TIM2,TIM_OCInitStructure); // 输出比较通道1初始化TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable); // 使能TIMx在 CCR1 上的预装载寄存器TIM_ARRPreloadConfig(TIM2,ENABLE); // 使能预装载寄存器TIM_Cmd(TIM2,ENABLE); // 使能定时器
}初始化时配置如下配置为10KHz TIM2_CH1_PWM_Init(1000,71); // 初始化PWM3.3 电机控制程序
电机正反转和停止控制程序如下
/***函数名称Med_Motor_Go*函数功能电机正转*输入参数无*返回值无*备 注无**/
void Med_Motor_Go (void)
{MOTOR_IN1 1;MOTOR_IN2 0;
}
/***函数名称Med_Motor_Stop*函数功能电机停转*输入参数无*返回值无*备 注无**/
void Med_Motor_Stop (void)
{MOTOR_IN1 0;MOTOR_IN2 0;
}
/***函数名称Med_Motor_Reverse*函数功能电机反转*输入参数无*返回值无*备 注无**/
void Med_Motor_Reverse (void)
{MOTOR_IN1 0;MOTOR_IN2 1;
}
宏定义如下
// 电机逻辑控制引脚
#define MOTOR_IN1 PCout(7)
#define MOTOR_IN2 PCout(8)3.4 串口接收处理函数
串口需要根据接收到的占空比来配置输出PWM的占空比配置占空比使用的库函数是
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)串口只支持输入大于100小于1000的占空比串口接收处理程序如下
/***函数名称USART1_IRQHandler*函数功能USART1中断服务函数*输入参数无*返回值无*备 注无**/
u32 gReceCount 0; // 接收计数变量
u32 gClearCount 0; // 清空接收数组计数变量
u8 gReceFifo[1500]; // 接收数组
u8 gReceEndFlag 0; // 接收完成标志位 void USART1_IRQHandler(void)
{if(USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) //接收到一个字节 {gReceFifo[gReceCount] USART_ReceiveData(USART1);}else if(USART_GetITStatus(USART1,USART_IT_IDLE) ! RESET) //接收到一帧数据{USART1-SR; // 先读SRUSART1-DR; // 再读DRgReceEndFlag 1; // 接收完成标志置1 }
}
/***函数名称Uart_Rece_Pares*函数功能解析串口接收内容*输入参数无*返回值无*备 注无**/
void Uart_Rece_Pares(void) // 串口接收内容解析函数
{u16 pwmDuty 0; // 接收串口发送来的占空比if (gReceEndFlag 1) // 如果接收完成{// 解析接收内容pwmDuty (gReceFifo[0] - 48) * 100;pwmDuty pwmDuty (gReceFifo[1] - 48) * 10;pwmDuty pwmDuty (gReceFifo[2] - 48);if (pwmDuty 100){pwmDuty 100;}if (pwmDuty 1000){pwmDuty 1000;}printf (duty%d\r\n,pwmDuty);TIM_SetCompare1(TIM2,pwmDuty);// 清空接收数组for (gClearCount 0;gClearCount gReceCount;gClearCount ){gReceFifo[gClearCount] ;}gReceEndFlag 0; // 清除接收完成标志位gReceCount 0; // 清零接收计数变量}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83118.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!