先说明一下 由于我实验用到的电机是12v的 但是单片机输出的供电不能达到12v 所以要用一个电压转换的电路板(其原理是放大电流从而增压)
首先明确一下电机工作的原理 我用到的是编码电机 编码器旁边写着电机需要用的几条线从上到下分别为:电机线+ 编码器GND B相 A相 编码器5V 电机线-
我们本次的实验是不需要用到编码器的(以后会出一个编码器的版本) 所以我们只需要控制时钟去输出PWM信号然后去控制电机线+ 电机线-即可(中间几条线不用管)
需要明确 电机线+输入高电平 电机线-输入低电平是控制电机正转的
电机线-输入高电平 电机线+输入低电平是控制电机反转的
我们可以试一下直接在其对应的GPIO引脚输出高电平、低电平,我们会发现它是全速转动的
那么是不是可以通过把单片机输出的电平通过定时器去调节PWM占空比去调节转速?答案是可以 可以把占空比的调节理解成我们可以把占空比高电平的部分均分至整个周期 比如如果占空比为100% 即周期内电压全部置高 平均电压为x 如果为50% 则周期内平均电压为x/2 这样就相当于把输出电平调高调低
上面就是我们这个实验的基本原理 那么怎么用hal库来做呢?
我本人这次还是用了高级定时器TIM8 先在Mode那里设置PWM通道模式
之后设置setting
计数器配置这样的原因我已经在上一篇文章里说过了
先说一下我选择不同的PWM模式的原因:
mode1和mode2的区别在于 mode1是先输出高电平 等到边沿变化时再转换成低电平 mode2则是先输出低电平
我的想法是通道一设为mode1 先输出高电平 通道二设为mode2 先输出低电平 【这样两个通道一开始时正好电平互补 且电机为正转 当然两个通道可以都设成mode1 只不过后面配置Pulse要更改一下数值】 之后设置Pulse(和占空比有关 计数器计数到这个数时会产生边沿变换) 设置通道一的Pulse默认为5000 占空比为50% 通道二的Pulse为10000 即一直输出低电平PWM 即通道二的值为零
按默认模式输出的电机转动速度应该是中速(速度是我们一开始直接输入高低电平到GPIO引脚那种方法产生的电机转动速度的一半)
然后我们可以在keil里通过去写入CCRx寄存器(x代表通道x,可为1,2,3,4)去控制占空比
先宏定义CCRx寄存器的地址 可以去中文参考手册找对应基地址和偏移值
然后我们可以对其写入值实现高速转动 低速转动 可以定义一个函数去实现
例如
void UpSpeed(void)
{
i=0;
for(i=0;i<4900;i++)
{
TIM_CCR1=5000+i;
TIM_CCR2=10000;
}
}
这个函数定义一个自加的变量i, 令通道一的CCR寄存器输入5000+i,即通道一对应的计数器每次循环都要计数到5000+i才转换成低电平,即通道一的输出电平变高,对应的速度变快
同理 我们可以写一个CCR=5000-i的去替换 可以实现电机减速
然后我们可以写向左转 向右转的函数,原理是让一个电机速度变为零或减速,另一个电机原速,这样去实现,由于我们要用到两个电机,所以我们要配置四个通道(一个电机有两个通道,一个高一个低)
函数可以这样写
void right(void)
{
TIM_CCR1=50;
TIM_CCR2=10000;
TIM_CCR3=7000;
TIM_CCR4=10000;
}
原本输出高电平的通道1的CCR寄存器值被我们调低(具体可以根据个人需求调),另一个电机的高电平输出通道3的CCR值调到了7000,这样可以实现右转
左转的函数同理 这里就不再赘述了。