加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

关于编码器计反转脉冲数不正常

(2017-11-13 08:15:35)
标签:

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,1000TIMx->CNT计数器存放补码

电机反转:假设得到的脉冲数是-3000

二进制  原码 = 1000,1011,1011,1000  

反码 = 1111,0100,0100,0111

补码 = 1111,0100,0100,1000

由于CNT的类型是  __IO uint16_t CNT,那么 -3000的补码1111,0100,0100,1000被机器识别为正数的补码(首位被识别为数值位)补码1111,0100,0100,1000视为正数的补码后转换为十进制为62536这就是反转计数值会飞跑得原因。

 

当程序为:n = (short) TIM2->CNT;

CNT的计数值被强制转换为short类型,即脉冲数-3000的补码被正常识别为1111,0100,0100,1000,其原码1000,1011,1011,1000,转换成十进制-3000(首位识别为符号位)

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有