智能车制作
标题:
谈谈XS128的脉冲计数问题,讨论如何按照手册编程
[打印本页]
作者:
zhjb1
时间:
2011-3-24 11:45
标题:
谈谈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的值,就是每秒的
计数值了。
作者:
vgjkl
时间:
2011-3-24 21:10
支持分享!
作者:
vgjkl
时间:
2011-3-24 21:10
回去试试去
作者:
vgjkl
时间:
2011-3-24 21:11
作者:
一剑卡卡
时间:
2011-3-24 23:10
好呀。。。。及时。。。
作者:
一剑卡卡
时间:
2011-3-24 23:10
纠结测速很久了。
作者:
kun08
时间:
2011-3-24 23:39
作者:
Baiwenjian
时间:
2011-3-24 23:50
灰常灰常感谢楼主分享
作者:
guowenzhi
时间:
2011-3-25 15:16
好难啊,没看懂
作者:
machuan20082006
时间:
2011-4-2 09:39
顶
作者:
梧桐1209
时间:
2011-4-3 11:30
恩呢
作者:
Lermonto
时间:
2011-4-3 15:39
支持原创,支持技术讲解……
作者:
zzchao1109
时间:
2011-4-4 08:31
顶一顶
作者:
120472996
时间:
2011-4-4 21:53
非常感谢!
作者:
闪耀吧我的阳光
时间:
2011-4-4 23:03
( ⊙o⊙ )哇
作者:
yl_dc
时间:
2011-4-6 20:39
顶起~~
作者:
g598618971
时间:
2011-4-7 01:04
不错,好厉害
作者:
LEUNG
时间:
2011-4-8 10:53
作者:
dengjinyong
时间:
2011-4-10 16:29
谢咯
作者:
xtdxhw
时间:
2011-4-21 16:58
谢啦!
作者:
cheerhh
时间:
2011-4-24 19:12
MARK,谢谢~
作者:
hjj913
时间:
2011-4-24 20:23
回复
1#
zhjb1
楼主,有一个问题,为什么PT7口采集脉冲,中断程序的入口地址却会是pit0,而不会是其他的pit1.2.3.4呢
作者:
xhf
时间:
2011-4-24 21:14
ding
作者:
xujiahua1231
时间:
2011-4-25 18:57
xiexie
作者:
zhjb1
时间:
2011-4-25 20:11
回复
22#
hjj913
我的程序是用的PIT0口读取脉冲数,如果采用实时时钟读取,只能从PT7读取
作者:
hjj913
时间:
2011-4-26 13:17
本帖最后由 hjj913 于 2011-4-26 13:19 编辑
回复
25#
zhjb1
可是资料上写的是这样子的
[attach]7215[/attach]
当MOD为0时是对输入引脚PT7的下降沿计数,然后你的程序时PT0采集输入脉冲,而且你这里也写到是读取PT7的值
[attach]7216[/attach],
这个我有点糊涂了。
还有一个实时时钟和系统时钟我有点分不清,PIT是系统时钟吗?xs128的实时时钟是MDC和TIMER这两设置的吗。问题比较多,麻烦楼主耐心点,详细点了,呵呵。
作者:
hjj913
时间:
2011-4-26 15:12
回复
26#
hjj913
上面第一幅截图少了一部分,是PAMDO=0的情况下PEDGE=0,则对脉冲输入引脚PT7的下降沿计数
作者:
zhjb1
时间:
2011-4-26 21:45
你看第一页,我设定的是从PT0得到脉冲,不是PT7。
作者:
张争鸣
时间:
2011-4-27 13:00
我也试试
作者:
夏日飞鸟123
时间:
2011-4-27 15:38
更好
作者:
zhangyuan728
时间:
2011-5-1 11:42
先顶一个
作者:
laoniuxxj
时间:
2011-5-1 12:01
赞
作者:
justfrog
时间:
2011-5-1 15:58
DING!
作者:
Lermonto
时间:
2011-5-1 18:52
嗯,支持楼主,顶下先
,再好好看
作者:
黄正
时间:
2011-5-9 14:37
测速 难 难 测速
作者:
freezing189
时间:
2011-5-20 16:04
不错不错。。。呵呵 好好看看
作者:
freezing189
时间:
2011-5-20 16:04
不错不错。。。呵呵 好好看看
作者:
freezing189
时间:
2011-5-20 16:04
不错不错。。。呵呵 好好看看
作者:
Rukelir
时间:
2011-6-20 18:01
学习
作者:
excellentlizhen
时间:
2011-9-19 14:58
HAO
作者:
dashier
时间:
2011-11-30 22:12
学习中
作者:
在所不辞
时间:
2012-2-12 21:31
不明白PACNT
作者:
云ydfq淡风轻
时间:
2012-2-18 16:02
作者:
李帅李帅
时间:
2012-3-6 15:32
谢谢
作者:
断翅at雄鹰
时间:
2012-3-16 18:17
还是不懂,用的时候两个都需要初始化吗
作者:
zsk-
时间:
2012-3-29 11:19
顶!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
作者:
wendaoxyp
时间:
2012-7-13 20:13
谢了
作者:
梁小龙
时间:
2013-3-1 21:20
hao
作者:
Universe
时间:
2013-3-4 21:21
看着不错哦
作者:
hpbfsj
时间:
2013-4-22 13:39
看了 谢了!
作者:
917052549
时间:
2013-9-4 15:15
貌似有用,到时候看看能用不
作者:
呆逼。
时间:
2014-1-25 09:47
楼主你好,我想问下 脉冲累加器只规定从PT7输入,那我如何同时检测编码器的A相和B相呢?
作者:
李新帅
时间:
2014-2-13 10:35
不懂
作者:
★奔/1孓亥★
时间:
2014-6-5 23:27
O(∩_∩)O谢谢
欢迎光临 智能车制作 (http://111.231.132.190/)
Powered by Discuz! X3.2