一、涉及资源
stm32f103ZET6开发板(非指定) MG513P3012V型号电机(带霍尔编码器)(非指定)
二、涉及概念
1、单片机资源要求
此种测速方法要求单片机的定时器具有编码器模式,对于stm32f1系列,具备编码器模式的定时器有TIM1/2/3/4/5/8,定时器使用通道1、2来实现编码器功能,接线时注意把A/B相接到定时器通道1/2的引脚。
2、减速比
电机结构 减速结构 减速比为1:30通俗地讲就是当电机外伸轴转1圈时实际轴转30圈,外伸轴我们一般接上轮胎等实际作用物体,而实际轴是电机自身的转子,霍尔编码器的检测对象是实际轴
3、测速原理
霍尔编码器工作方式
霍尔编码器是一种通过磁电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。霍尔编码器是由霍尔码盘和霍尔元件组成。霍尔码盘是在一 定直径的圆板上等分地布置有不同的磁极。电机旋转一圈霍尔元件发出特定数目的脉冲信号。,用时间间隔内接收的总的脉冲数目除以转一圈发出的脉冲数目即可得到转轴转的圈数,再除以时间间隔就能得到转速。 为判断转向,一般输出两组存在一定相位差的方波信号。
定时器判断电机正反转的依据
定时器通道1、通道2接收A相和B相的脉冲信号,转一圈A相和B相发出的脉冲数目是一样的,但是发送有先后之分。
定时器针对正反转的两种计数方式
定时器在编码器模式下有两种计数方式,正转时是从重载值开始向下减数,反转时是从零开始向上加数(正反是相对而言的)。例如,如果我设定定时器的重载值为0x7fff,那么当定时器接收到10个正转的脉冲时,计数值变为0x7ff3,当定时器接收到的是反转的脉冲时,定时器的计数值变为0x000A。
定时器编码器模式1、2、3
TI1和TI2分别为定时器的通道1和通道2
编码器模式3即为四倍频模式,这个模式下对于A和B相发过来的一组脉冲会有四次计数(四个跳变沿),这样就能将检测精度提到四倍。
4、M法测速
三、编码器与单片机的接线
注:这里以stm32f1系列的定时器4为例,若使用其他定时器进行测速需要更换对应的引脚资源,编码器A/B相需接到定时器的通道1和通道2
1、霍尔编码器实物图
接线
编码器A相和B相接PB6和PB7引脚(无对应要求)
四、单片机引脚和定时器的初始化
1、代码示例
引脚选择PB6和PB7 定时器选择TIM4,使用编码器模式3
void EncoderA_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 0xffff;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 0x03;
TIM_ICInit(TIM4, &TIM_ICInitStructure);
TIM_Cmd(TIM4, ENABLE);
}
五、读定时器的计数值
定时器的计数值即为编码器发出的脉冲数目*4(定时器的编码器模式3)
void Read_EncoderA(void)
{
if(TIM4->CNT > 0x7fff)
{
EncoderA = TIM4->CNT - 0xffff;
}
else
{
EncoderA = TIM4->CNT;
}
TIM4->CNT = 0xffff;
}
六、由定时器计数值得到转速
1、计算公式
使用M法测速,计算公式为: 转速n = 总脉冲数/四倍频/单圈脉冲数/减速比/时间间隔
2、代码示例
电机转一圈本款霍尔编码器发出13个脉冲,本款电机的减速比为1:30
void Get_MotorA_Speed(void)
{
Read_EncoderA();
MotorASpeed = (float)EncoderA / 4 / PulseNum / ReRate / DecodeGapTime * 1000;
}
|