发布时间:2025-12-10 19:31:45 浏览次数:16
ros 移动机器人_分拣机器人驱动电机ROS—–32电机驱动,内容简单,算是补上之前的
驱动电机,我们在这里使用TB6612来驱动电机,同时,电机的内部我们有编码器进行计次
输出比较
cnt,就是时基单元寄存器
ccr,在cnt下方,为捕获比较寄存器,cc是捕获比较的意思,r就是寄存器
他就可以在捕获与比较之间进行切换
cnt计数是自增的,CCR是我们给定的一个值,当cnt大于ccr 小于ccr 等于ccr时,CH1通道就会对应的置1 / 0 / 1 / 0,为我们需要用这个来输出PWM波形
PWM参数: 频率 = 1 / ts 占空比 = ton / ts 分辨率 = 占空比变化
上图为输出控制OC输出PWM,相同的下面还有3个通道
我们可以控制大小,控制输出的REF的高低电平
输出比较模式
PWM的结构我们之前说过,就不过多介绍,看一张图我们就能明白
直流电机
有两个电极,正接正转,反接反转,我们看看TB6612电路
所以我们可以看出,想要驱动一个电机,我们需要配置3个IO口,一个PWM,两个AIN1/2
TB6612.h
#ifndef TB6612_H#define TB6612_H#include "sys.h"/*B0 口*/#define AIN1_GPIO_PINGPIO_Pin_3#define AIN1_GPIO_PORTGPIOB#define AIN1_GPIO_CLKRCC_APB2Periph_GPIOB/*输出高电平*/#define AIN1_ONGPIO_SetBits(AIN1_GPIO_PORT,AIN1_GPIO_PIN)/*输出低电平*/#define AIN1_OFFGPIO_ResetBits(AIN1_GPIO_PORT,AIN1_GPIO_PIN)/*B1口*/#define AIN2_GPIO_PINGPIO_Pin_4#define AIN2_GPIO_PORTGPIOA#define AIN2_GPIO_CLKRCC_APB2Periph_GPIOA/*高电平*/#define AIN2_ONGPIO_SetBits(AIN2_GPIO_PORT,AIN2_GPIO_PIN)/*低电平*/#define AIN2_OFFGPIO_ResetBits(AIN2_GPIO_PORT,AIN2_GPIO_PIN)/*B10口*/#define BIN1_GPIO_PINGPIO_Pin_5#define BIN1_GPIO_PORTGPIOA#define BIN1_GPIO_CLKRCC_APB2Periph_GPIOA#define BIN1_ONGPIO_SetBits(BIN1_GPIO_PORT,BIN1_GPIO_PIN)#define BIN1_OFFGPIO_ResetBits(BIN1_GPIO_PORT,BIN1_GPIO_PIN)/*B11口*/#define BIN2_GPIO_PINGPIO_Pin_12#define BIN2_GPIO_PORTGPIOB#define BIN2_GPIO_CLKRCC_APB2Periph_GPIOB#define BIN2_ONGPIO_SetBits(BIN2_GPIO_PORT,BIN2_GPIO_PIN)#define BIN2_OFFGPIO_ResetBits(BIN2_GPIO_PORT,BIN2_GPIO_PIN) void AIN1_GPIO_Config(void);void AIN2_GPIO_Config(void);void PWMA_STOP(void);void PWMA_Forward(int a);void PWMA_Reverse(int a); void BIN1_GPIO_Config(void);void BIN2_GPIO_Config(void);void PWMB_STOP(void);void PWMB_Forward(int a);void PWMB_Reverse(int a);void TB6612_GPIO_Config(void);void STOP(void);void Forward(int a);void Reverse(int a);#endif 是否还在为Ide开发工具频繁失效而烦恼,来吧关注以下公众号获取最新激活方式。亲测可用!
【正版授权,激活自己账号】:Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】:官方授权 正版激活 自己使用,支持Jetbrains家族下所有IDE…
TB6612.c
#include "TB6612.h"#include "base_generaltim.h"#include "stm32f10x.h"// 开启AIN1,GPIOvoid AIN1_GPIO_Config(void){GPIO_InitTypeDefGPIO_InitStruct;RCC_APB2PeriphClockCmd(AIN1_GPIO_CLK,ENABLE);GPIO_InitStruct.GPIO_Pin = AIN1_GPIO_PIN;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//使用推挽输出GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(AIN1_GPIO_PORT,&GPIO_InitStruct);}// 开启AIN2void AIN2_GPIO_Config(void){GPIO_InitTypeDefGPIO_InitStruct;RCC_APB2PeriphClockCmd(AIN2_GPIO_CLK,ENABLE);GPIO_InitStruct.GPIO_Pin = AIN2_GPIO_PIN;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³öGPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(AIN2_GPIO_PORT,&GPIO_InitStruct);}void BIN1_GPIO_Config(void){GPIO_InitTypeDefGPIO_InitStruct;RCC_APB2PeriphClockCmd(BIN1_GPIO_CLK,ENABLE);GPIO_InitStruct.GPIO_Pin = BIN1_GPIO_PIN;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³öGPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(BIN1_GPIO_PORT,&GPIO_InitStruct);}void BIN2_GPIO_Config(void){GPIO_InitTypeDefGPIO_InitStruct;RCC_APB2PeriphClockCmd(BIN2_GPIO_CLK,ENABLE);GPIO_InitStruct.GPIO_Pin = BIN2_GPIO_PIN;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//ÍÆÍìÊä³öGPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(BIN2_GPIO_PORT,&GPIO_InitStruct);}// 开启两个IO口,控制对应输出口void TB6612_GPIO_Config(void){ AIN1_GPIO_Config(); AIN2_GPIO_Config(); BIN1_GPIO_Config(); BIN2_GPIO_Config();}void PWMA_STOP(void)//{AIN1_OFF;AIN2_OFF;GENERAL_ccr1_Mode_Config(0); //PWM输出//PWM的初始化,在前两个函数,放在了主函数} void PWMA_Forward(int a)//01ΪÕýת{AIN1_OFF;AIN2_ON;GENERAL_ccr1_Mode_Config(a);}void PWMA_Reverse(int a)//10Ϊ·´×ª{AIN1_ON;AIN2_OFF;GENERAL_ccr1_Mode_Config(a);}void PWMB_STOP(void)//00Ϊֹͣ{BIN1_OFF;BIN2_OFF;GENERAL_ccr2_Mode_Config(0);}void PWMB_Forward(int a)//01ΪÕýת{BIN1_OFF;BIN2_ON;GENERAL_ccr2_Mode_Config(a);}void PWMB_Reverse(int a)//10Ϊ·´×ª{BIN1_ON;BIN2_OFF;GENERAL_ccr2_Mode_Config(a);}void STOP(void){PWMA_STOP();PWMB_STOP();}void Forward(int a){PWMA_Forward(a);PWMB_Forward(a);}void Reverse(int a){PWMA_Reverse(a);PWMB_Reverse(a);} 我们也可以直接配置,然后在Compare里面来进行设定空比(调速)
同时也要进行对电机内编码器的计算
开启IC输出比较,进行cnt计算编码器计次,通过清零读数来计算编码器脉冲,计算编码器最主要的用途是用于PID的使用,我们下一节再说明