关于编码器计反转脉冲数不正常
标签:
stm32编码器脉冲数正反转计数pwm |
分类: 技术类 |
关于编码器计反转脉冲数不正常
By:T7
Date:20171113
At:YSU_B307
不正常代码:
void TIM3_IRQHandler()
{
//n_set=100;
int n;
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
n=TIM2->CNT;
n_acture=1500*n/334/2;
ti=Position_PID(n_acture,Target_Speed);
ti=Speed_Amplitude(ti);
SET_Speed(ti);
TIM2->CNT=0;
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
}
}
正常代码:
void TIM3_IRQHandler()
{
//n_set=100;
int n;
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
n = (short) TIM2->CNT;
n_acture=1500*n/334/2;
ti=Position_PID(n_acture,Target_Speed);
ti=Speed_Amplitude(ti);
SET_Speed(ti);
TIM2->CNT=0;
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
}
}
终端服务函数每10ms进入一次,在进入之后读取TIM2-CNT的计数值(10ms内,编码器所输出的脉冲数)。
TIMx_CNT寄存器手册如下:(16位,故计数最大值 = 2^16 = 65536)
http://s15/mw690/005xyXUizy7fLAkRTnEee&690
当程序为:n=TIM2->CNT;
电机正转,假设得到的脉冲数是3000,机器以补码的方式存储
二进制 原码 = 反码 = 补码 = 0000,1011,1011,1000,TIMx->CNT计数器存放补码
电机反转:假设得到的脉冲数是-3000,
二进制
反码 = 1111,0100,0100,0111
补码 = 1111,0100,0100,1000
由于CNT的类型是
当程序为:n = (short) TIM2->CNT;
CNT的计数值被强制转换为short类型,即脉冲数-3000的补码被正常识别为1111,0100,0100,1000,其原码为1000,1011,1011,1000,转换成十进制-3000(首位识别为符号位)。

加载中…