查看: 2240|回复: 9
|
从一个Input计算waveform period
[复制链接]
|
|
i. 你要想做什么? 你的应用是什么?
用mcu读取外来input然后计算time period.
计算一个dc motor的RPM. 读dc motor rpm 的是类似Encoder With Plate
http://www.cytron.com.my/viewProduct.php?pcode=RE08A&name=Encoder%20With%20Plate
当有pulse进入时读取waveform.
ii. 你想要拿到什么效果
利用waveform period 算出 RPM。
iii. 你做了什么
读完所有佳礼关于ADC的贴,也成功写出.
读关于timer0,timer1,timer2 data 成功模仿PWM
iv. 你遇到了什么问题。
不知如何从ADC读取waveform,因为要计算当input时开始计时trigger多久. 当没有input时egde down.
timer1 里有个capture mode 不懂如何program.
v. 你用什么MCU?
PIC16F877A
MPLAB IDE v8.83
vi. 你用什么语言? ASM /C/PICBasic/Keil?Compiler 版本?
c language
HI-tech c compiler pro
vii. 有源码吗? 如是抄来的请注明出处, 请放链接。
没有相关的Sample.
ix. 你google 了吗? 你的搜索关键字是什么?
ADC waveform
PIC RPM hitech
pic capture mode
表达能力不好...看不明白在补充... |
|
|
|
|
|
|
|
发表于 10-4-2012 10:35 AM
|
显示全部楼层
i. 你要想做什么? 你的应用是什么?
用mcu读取外来input然后计算time period.
计算一个dc motor的RPM. 读dc motor rpm 的是类似Encoder With Plate
~J~1 发表于 9-4-2012 12:54 PM
你的输入是TTL Pulse 脉冲 是吗?
为什么你要要用ADC 来读取? 有什么特别原因吗? |
|
|
|
|
|
|
|
楼主 |
发表于 10-4-2012 01:29 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 11-4-2012 07:41 AM
|
显示全部楼层
对...输入是TTL Pulse 脉冲
因为在RC2试不到 capture mode(不会用),想从ADC着手。
~J~1 发表于 10-4-2012 01:29 PM
不要用ADC, ADC 的应该不是这样的。
CCP是正确的。
你要试试去理解。。
还有另一种方法, 就是Timer0 external Clock input, RA4 , TOCKI
调零 Timer0, 你的脉冲输入去RA4, 然后启动另一个timer 计时。 timer 0 在16F877A 是8bit,255 次后,timer 0 overflow 满溢, 你看用了多少时间, 就可以计算出RPM。
RPM, 其实可以很容易, 也可以很难。。。
太快的测试不到, 太慢的如1~2 RPM 也测试不到, 程序方面要下功夫、。。先决定你要测的范围。。
PIC16F877A 是当时很红的一款MCU, 差不多是第一款Flash memory的, 在它之前的都是OTP (One Time Programming)., 要不就是Eprom (要用UV 光去檫除的) 的。。
PIC16F877A 后来被PIC16F887取代, 但是目前会鼓励大家多使用PIC16F1937/9 |
|
|
|
|
|
|
|
楼主 |
发表于 11-4-2012 02:13 PM
|
显示全部楼层
TRISC=0b00000010;
OPTION_REG=0b10010000;
CCP2CON=0b00000101;
T1CON=0b01000011;
while(1)
{
CCP2IF=0; //clear Interrupt flag
while (CCP2IF!=1) continue; //wait for an interrupt
start = CCPR2H << 8; // save start time
start = start|CCPR2L;
CCP2IF=0; //clear interrupt flag
while (CCP2IF!=1) continue; //wait again for next interrupt
finish = CCPR2H << 8; // save start time
finish = finish|CCPR2L;
period=finish-start; //calculate period
rpm = 60*(1/period);
}
用sample capture方式写了一个, 可是CCPR2H没save到value。是用lcd来查start, finish, period 的value, 都等于0. 有没有别的方法可以知道start, finish, period 的value? |
|
|
|
|
|
|
|
楼主 |
发表于 11-4-2012 02:16 PM
|
显示全部楼层
补充: 用max:170rpm 的 dc motor...
rpm搜索范围大概在30rpm至130rpm 左右
这样的范围会难吗?和需要高resolution吗? |
|
|
|
|
|
|
|
发表于 12-4-2012 01:58 PM
|
显示全部楼层
补充: 用max:170rpm 的 dc motor...
rpm搜索范围大概在30rpm至130rpm 左右
这样的范围会难吗?和需要高r ...
~J~1 发表于 11-4-2012 02:16 PM
首先, 你确定是30~130RPM?
30RPM/ 60= 0.5hz
130RPM/ 60= 2.166hz
如是这种速度, 你用I/O + Timer 直接量吧。。
估计CCP 量不到这种慢速。。。或者我不会。。
我做过的用CCP只是能量150 ~999 rpm , 还是规定要用4Mhz 的clock 呢。 |
|
|
|
|
|
|
|
楼主 |
发表于 14-4-2012 02:09 AM
|
显示全部楼层
是这个范围~~
谢谢pic指导....
想知道我写的code是可以用的吗?因为不懂reading 和 save 的方法。。对RC1 input 还是没有value... |
|
|
|
|
|
|
|
发表于 14-4-2012 09:37 AM
|
显示全部楼层
是这个范围~~
谢谢pic指导....
想知道我写的code是可以用的吗?因为不懂reading 和 save 的方法。。对 ...
~J~1 发表于 14-4-2012 02:09 AM
CCP 我估计是不行了。。时间太长了。。。
(高手可能会想:可以用累积的方法, 但是也没有必要了。。)
先理解,
30 RPM =
30RPM/ 60
= 0.5hz
= 2sec
130RPM/ 60
= 2.166hz
=0.462sec
你直接用timer 测量两个 pulse 之间的时间算了。。。
起始时先等pulse 从Low to High
当pulse 变high 时, reset timer。
然后等pulse 从high 去low。
当pulse 再度从Low 变high 时, 记录 timer, 取timer 的值。
然后换算去 RPM, 然后显示。
问题是, timer, 你要写一个长时间的timer routine,
可能是1000ms, 精确到1ms 的,
每过1000ms, 你的sec counter + 1
那么你就可以实现一个长时间的timer。
因为这个RPM 很慢。。你的刷新显示也不会太频密的。。
上面是一个概念, 给你参考。
如果你能够使用 CCS C, 或许我可能有空时写一段示范程序给你看。。 |
|
|
|
|
|
|
|
发表于 8-6-2012 05:35 PM
|
显示全部楼层
回复 8# ~J~1
这样慢速, interrupt可能会比较好。 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|