stm32模块笔记——直流减速编码电机
编码电机的编码器线数和减速电机的减速比比较重要,直流减速编码电机在PID算法中有着举足轻重的地位,可以说是不得不品的一步。
1.编码电机简介
编码电机常由直流减速电机和编码器组成。编码电机的好处也就在于编码器,可以通过编码器来判断电机的速度和位置。
可以说用来调试PID算法是必备的,我到后面电机基本上就使用编码电机了。
想要明确使用好编码电机,我认为有两点必须要搞懂,一是编码器,二是减速比。
否则你连编码电机转一圈的计数值都不知道,何来调试一说呢?
1.编码器
编码器的工作原理,说复杂也不复杂,说简单讲起来也极为费口舌。以实用为目的的话,其实搞清楚两点就好,这样看起来更简单明了。
图来源江科大
编码器测速的原理在于霍尔传感器。上图中黑色圆圈为磁铁,磁铁旁边两个小黑块就是霍尔传感器,电机转动,带动磁铁转动,两个霍尔传感器便会输出方波。
l
因为霍尔传感器相对于磁铁,呈90度放置,因此两个霍尔传感器输出的方波会相差90度,也就是图中A相、B相方波相差半格。
因为A、B相相差半格,因此可以通过A、B相相对输出的波形,来判断旋转的方向。
磁铁转一圈,输出的脉冲数,与磁铁的南北极分布有关。图中A、B相输出波形为11个脉冲,说明磁铁共有22个极,11个对极。
简单理解,编码器转一圈所输出的波形长短,与磁铁有关,如上所示,磁铁有11个对极,编码器会输出11个脉冲,就称为这个编码器为11线编码器。
如果你的代码写的定时器是通过上下沿来判断波形,那么A、B两相,你的编码器旋转一圈,则你的定时器CNT计数值会增加11 * 2 * 2 = 44.
当然,这是以11线编码器举例,不同的编码器,线速不同,旋转一圈增加的计数值也不同。我买过一个13线的编码器,旋转一圈,CNT计数值就增加52了。
只理解了编码器是远远不够的,还有一个地方,也决定了计数值的大小,就是减速电机
2.减速比
直流电机旋转速度较快,减速器可以通过齿轮来降低电机的转速,来提高扭矩,增加扭力。
编码器是套在直流电机上的,直流电机旋转一圈,编码器便会旋转一圈,但因为减速器的存在,电机实际上输出的并没有达到一圈。
此时减速比便出现了,减速比就是减速电机旋转一圈,比上直流电机需要旋转多少圈。
例如,你的减速器的减速比为1:10,那此时,你电机旋转一圈,所输出的计数值应该是上面计算的44再乘上个10,也就是44 * 10 = 440。
也就是说,直流减速电机旋转一圈,你的定时器CNT计数值会增加440.
所以说,影响CNT计数值的是两个因素,一是编码器线数,一是减速比。
直流减速编码器电机旋转一圈,增加的计数值计算方式应该为:线速 * 减速比 *4(定时器检测波形的方式会导致这数的改变)
2.实操代码
想要使用电机,还需要电机驱动的帮助,我本人常使用的是TB6612,如果不熟悉的话,可以看我上一篇博客
想要使用编码电机,需要用到6根线,两条为电机的驱动电源线,一条VCC,为编码器供电,一条GND,为编码器接地,两条编码器的信号线。
接线如图所示
所用代码如下
首先是配置定时器,用的TIM3
void Encoder_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICFilter = 0xF;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICFilter = 0xF;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
TIM_Cmd(TIM3, ENABLE);
}
int16_t Encoder_Get(void)
{
int16_t Temp;
Temp = TIM_GetCounter(TIM3);
TIM_SetCounter(TIM3, 0);
return Temp;
}
再然后是主程序,用来测试代码和观察现象,这里还用到了另一个定时器,每经过一定时间便返回一次编码器计数值
int16_t Speed;
int16_t Location;
int main(void)
{
Timer_Init();
Encoder_Init();
OLED_Init();
while(1)
{
OLED_Printf(0,0,OLED_8X16,"Speed:%+05d",Speed);
OLED_Printf(0,16,OLED_8X16,"Location:%+05d",Location);
OLED_Update();
}
}
void TIM1_UP_IRQHandler(void)
{
static uint16_t Count;
if(TIM_GetITStatus(TIM1,TIM_IT_Update)==SET)
{
Count ++;
if(Count >= 40) {
Count = 0;
Speed = Encoder_Get();
Location += Speed;
}
TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
}
}
左右旋转电机,能发现speed会检测速度,locati则会通过计数值加减,来间接代表电机旋转位置。

3.总结
编码电机的编码器线数和减速电机的减速比比较重要,直流减速编码电机在PID算法中有着举足轻重的地位,可以说是不得不品的一步。
更多推荐



所有评论(0)