谈谈XS128的脉冲计数问题

2019-08-02 00:52

谈谈XS128的脉冲计数问题,讨论如何按照手册编程

编码器, 单片机, 传动轴, 定时器, 时间 谈谈XS128的脉冲计数问题

1. 测速在常用的方法是测速,一见到过的有两大类:A—采用编码器(包括才用鼠标器内的改用),B—采用检测光电 计数。

2. A方法精度高,成本也高,自改制会便宜一点;B自制便宜,精度不高。

3. A方法按照网上介绍的多是直接接在电机的传动轴上,如果是300mpr的编码器,一圈就是300个脉冲,如果电机

每秒10圈,就是3000个脉冲,这种编码器如果采用定时器的CCP——扑捉中断的功能将会使得单片机大量时间处理这 个中断,如果系统还有其它中断会造成技术不准等问题,因此适合门控计数的方案,而XS128只提供了一路16位门

控计数模块,并且规定只能从PT7口输入;

B方法由于是计数轴的转速,有采用霍尔的,有光电的(比如我们的方案就是轴上直测,一圈4个),他的采样速度比

编码器少的多,能差出2个数量级或以上,也就是最多数十个PS,可以采用门控计数,也可以采用CCP扑捉技术方案

,我们就是采用这个方案。这样可以有多路计数单元——实际只用1路——PT0口。

4. 如何编程,参考原文文档Chapter 16 Timer Module (TIM16B8CV2)P461中的16.3.2.15 16-Bit Pulse

Accumulator Control Register (PACTL)P478。针对门控计数,初始化用得着的有3个寄存器:PACTL控制寄存器、

PACNT数据寄存器、PAFLG标志寄存器,打开(CW中include/MC9S12XS128.h)文档,可以找到这些寄存器的bid名,可

以写成:PACTL_PAEN、PACTL_PAMOD等,直接控制需要的bit;下边是我编的频率计设置扑捉初始化: void time1Init(void){

PACTL_PAEN=0;//0-16b计数禁止,1允许,先禁止

PACTL_PAMOD=0;//0-计数模式,1-门时计数模式,设0

PACTL_PEDGE=0;//0下降沿,1-上升沿,指定有IOC7-PT7口输入,此位受PACTL_PAMOD影响,此设0

PACTL_CLK1=0;//当计数位外部脉冲,此设置无意义,都设0 PACTL_CLK0=0;

PACTL_PAOVI=0;//0-溢出中断禁止,1-允许,本例计数个数有time0时钟中断读取,不需要溢出中断,设0

PACTL_PAI=0;//0禁止中断,1允许,设0

PACNT=0;//计数器寄存器的值,可以使0000~FFFF,先清0 //PAFLG_PAOVF=1;//计数溢出FFFF>0000

PAFLG_PAIF=1;//脉冲数入1=IOC7-PT7,最大65536个脉冲 PACTL_PAEN=1;//16b计数允许

}

Time初始化,参考原文文档Chapter 12 Periodic Interrupt Timer (S12PIT24B4CV1)P349中的12.3.0.1 PIT

Control and Force Load Micro Timer Register (PITCFLMT)P353

用得着的寄存器:PITCFLMT、PITCE、PITMUX、PITINTE,与上相同,可以写成PITCFLMT_PITE格式直接控制需要的 bit(不解释了):

void Pit01_Init(void){

PITCFLMT_PITE=0; //禁止PIT

PITCE_PCE0=1; //允许时钟通道0 PITMUX_PMUX0=0; //通道0

PITMTLD0=0XFF; //通道0预设计数值为255 PITLD0=0X61A7; //time-out period=(PITMTLD+1)*(PITLD+1)/fBUS=256X25000/64000000=0.1s PITINTE_PINTE0=1;//通道0中断允许 PITCFLMT_PITE=1; //开PIT中断 }

因为是用时钟进行中断,而后读取计数器PT7的值所以需要编PIT0的中断程序,同样打开(CW中

include/MC9S12XS128.h)文档,在开头处可以找到#define VectorNumber_Vpit0 66U,语句表明

pit0的中断号为66,编程如下:

#pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 66 PIT0_ISR(void){//0.1秒中断1次 PACTL_PAEN=0;//16b计数禁止 spd =PACNT; PACNT=0;

PACTL_PAEN=1;//16b计数允许 PITTF_PTF0=1;//清除PIT0的标记 }

#pragma CODE_SEG DEFUALT 上述语句void interrupt 66

是必须这样写的,函数名称可以随意。

程序中调用spd就是每0.1秒所计的数,如果在中断程序中再加上一个计数器,10次再读取PACNT的值,就是每秒的 计数值了。


谈谈XS128的脉冲计数问题.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:保险粉

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: