STM32F103实现小车的转动
首先,我们要明白:电机转动的实质其实是对PWM波的控制输出;
( 库函数直接调用封装好的函数 TIM_SetCompare1()或者用CCR调节占空比)
PWM波输出的原理图如下:
其次,我用到了L298N型号的电机驱动,于是我通过淘宝的拍立淘或者是百度进行了电机的初步了解
下面我从网上找到了一个L298N电机驱动实物图,进行详细的描述:(通过此图可以进行实物连接)
注:千万小心,不要把引脚接反了,会少了芯片。
然后,进行代码的编写,可以引用正点原子的例程代码,在此基础上进行代码的编写。
我小车是直接控制两个电机,四个电机分成两组。让其中一侧电机的状态相同,另一个状态相同,,没有分别单独控制。
通过下图可以参考:IN1 IN2 IN3 IN4
1 0 1 0 实现电机的正转 小车前进
0 1 0 1 实现电机的反转 小车后退
1 0 0 1 小车右转
0 1 1 0 小车左转
但所有的前提是要先学会时钟实验和GPIO的初始化,这个时候就要补上上次STM32学习的内容了。
先进行STM32时钟和GPIO的学习
附上电机初始化代码
void Motor_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOA和GPIOB
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6 |GPIO_Pin_7 ;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_ResetBits(GPIOA,GPIO_Pin_6 |GPIO_Pin_7); //引脚先输出高电平
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 |GPIO_Pin_1 ;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_ResetBits(GPIOB,GPIO_Pin_0 |GPIO_Pin_1); //引脚输出高电平
之后,还需要自己写函数实现小车的前进,后退,左转和右转
需要注意的是PWM时钟输出的arr和psc的关系:
系统时钟设置为72MHz;
PWMFre=Sys/(arr+1)(psc+1)
TIM1_PWM_Init(999,71);//分频。PWM频率=72000/(999+1)*(71+1)=1Khz
周期为:1/1khz;