
背景
本文用于记录平衡自行车的制作过程,及制作中遇到的问题;总体方案如下:采用采用STM32F103C8T6作为主控单元、MPU-6050作为位姿采集单元、0.96寸OLED显示位姿、无刷电机带动动量轮调节小车平衡、1S锂电池配合5V和12V升压模块作为电源、蓝牙模块用于无线控制及调试、SG90舵机用于控制行驶方向。
业余爱好,水平有限,请多多指教,附上无数电机调试工程资料连接和平衡小车全部资料
链接:https://pan.baidu.com/s/1jtqiMjSJkpB8b31BLWQytg
提取码:1992

我用的无刷电机是在TB上淘的便宜货,小日本万宝至无刷电机,内置驱动,带100线双通道编码器,12V-24V的电压下均可运行。

在上一篇专栏建立工程()的基础上,使用外部中断测量电机转速,使用定时器3产生PWM信号控制电机转速,从而实现电机的闭环控制。
1、STM32外部中断配合编码器测速
将编码器A相与PA3连接,B相与PA4连接,并且连接编码器VCC、GND。
在mian.c文件中重新定义外部中断回调函数:
/* USER CODE BEGIN PV */
int32_t counterA = 0;
//重定义外部中断函数
/**
* @brief EXTI line detection callbacks.
* @param GPIO_Pin: Specifies the pins connected EXTI line
* @retval None
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == RESET)//检测编码器B相的电平,判断编码器转向
counterA +=1;
else
counterA -=1;
}
/* USER CODE END PV */ 在mian()函数while循环中增加在OLED中显示编码器运动状态的相关代码:
/* **********显示编码器数值*********** */ sprintf(buffer, "%d", counterA);//int32_t转换成char[] OLED_ShowStr(10,7,"Encoder:",1); OLED_ShowStr(60,7," ",1); OLED_ShowStr(60,7,buffer,1); 最终演示效果如下:

2、STM32定时器PWM控制电机转速
在mian()函数增加下列代码,打开定时器3,并设置初始占空比为1(此时为PWM输出为高电平)
//启动定时器3的通道1,控制无刷电机
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
//设置通道1的占空比,无刷电机0~1200
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1,1200); 在mian()函数while循环中增加下列代码,是PWM占空比由1-0逐渐下降
/* **********调试无刷电机转速*********** */
static uint16_t brushless1 = 1200;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1,brushless1);
brushless1 -=5;
if(brushless1<=0) brushless1 = 1200;
sprintf(buffer, "%d", brushless1);//int32_t转换成char[]
OLED_ShowStr(10,7,"BMoter:",1);
OLED_ShowStr(60,7," ",1);
OLED_ShowStr(60,7,buffer,1);
通过测量PWM输出引脚的电压变化,大致判断PWM输出是否正常,如下所示:

3、STM32F103C8T6引脚、外部中断、定时器3配置如下:
设置PA3引脚为GPIO_EXTI3;PA4引脚为GPIO_INPUT;

打开外部中断3

设置外部中断引脚PA3为上拉,触发模式:上升沿触发

设置引脚PA4为上拉

设置定时器3通道1位PWM输出模式,PWM频率位20kHz(计算方式参考()),初始占空比为1000。

业余爱好,水平有限,请多多指教,附上无数电机调试工程资料连接和平衡小车全部资料
链接:https://pan.baidu.com/s/1jtqiMjSJkpB8b31BLWQytg
提取码:1992