别人的产品用STC12C54(30M的晶振)输出60Kz-65Kz的方波(100Hz一个步进),我调死也调不
我一个步进就800Hz了,,,/*STC利用PCA产生timer产生方波输出*/
#include<reg52.h>
#define uint unsigned int
sfr CCON=0xD8;
sfr CMOD=0xD9;
sfr CL=0xE9;
sfr CH=0xF9;
sfr CCAP0L=0xEA; //COMPARE
sfr CCAP0H=0xFA; //COMPARE
sfr CCAPM0=0xDA;
sfr AUXR=0x8e;
sbit CR=CCON^6; //start signal
sbit CCF0=CCON^0; //中断标志
sbit OUT=P1^2; //方波输出端口
sbit OUT1=P1^5; //方波输出端口
void init_pca()
{
//CMOD=0x84; //定时器0作为PCA时钟源
CMOD=0x88; //系统时钟/1作时钟源
CCON=0x00;
CH=0;//先清零CH,CL
CL=0;
CCAP0L=1; //低位比较器
CCAP0H=0; //高位比较器
CCAPM0=0x49; //控制寄存器让PCA模块作为16 bit timer
//CCAPM0=0x42; //8位PWM,无中断
EA=1;
CR=1;
}
void pca_ISR() interrupt 7 using 3 //当CH和CL的值递增到和CCAP0H和CCAP0L相等时候 中断产生
{
CCF0=0;
CH=255; //改变次数据改变频率
CL=45; //改变次数据改变频率
OUT=~OUT;
}
void main()
{
init_pca();
CCAP0L=0XFF;
CCAP0H=0XFF;
while(1)
{
;
}
}
如何才能做到100HZ一个步进? 木有人回答呢,,,,, 等高人,,,, 假设单片机中时钟无倍频、定时器为1T,则:
30,000,000 / (2*65,000) = 230.77
30,000,000 / (2*64,900) = 231.12
.
.
.
30,000,000 / (2*60,000) = 250.00
说明分别用定高低电平时间的办法是没有办法实现精确100Hz步进的。
可能的出路:倍频、抖动。 那别人的产品是怎么实现的呢,,,,已经产量化了就是STC12C54的18脚输出来的。。 上 汇编 上汇编真是恶梦! 顶起了, 晕啊,放着可编程输出不用,用PCA干啥!!!
P1.0 可编程时钟输出CLKOUT0
P1.1 可编程时钟输出CLKOUT1 STC12C54没有T2可编程时钟输出, 也就是说只有8位的可编程输出8位的精度想100HZ一个步进显然不够!STC90C系列的有T2可编程输出是16位,,,,但还是满足不了,,, 3L已经证明了,这根本不可能,除非用PLL。 天啊,,,,我手头还有一个别人的产品,,,板子上面就一个芯片STC12C54,,,,人家怎么就能实现? 放图上来研究一下,怕什么 回复【9楼】hehanlou 何汉楼
-----------------------------------------------------------------------
看了3楼的分析,觉得真的无法精确到100Hz,
楼主把那板子上个图,示波器也抓几个图让大伙瞧瞧 汇编,不要用中断,固定延时法,可以做到一个指令周期的误差 对3楼的分析再做一个补充,证明不是无法精确到100Hz,而是根本不可能达到100Hz。
60KHz时,30,000,000 / (2*60,000) = 250.00
65KHz时,30,000,000 / (2*65,000) = 230.77
可以设定的捕获值只有250-231+1=20个,而需要达到100Hz的步进则需要(65000-60000)/100 + 1 = 51个,怎么可能达到?所以,抖动也是行不通的,老老实实的用PLL吧。
同样所述,不管是使用T0、T1、T2、汇编固定延时,都无法达到这个要求。
最简单的方法:输出600~650Hz,步进1Hz的脉冲,再100倍频,误差只有1/60000,足够用了。 用PCA的高速脉冲输出应该可以。步进100HZ不行。 有点对不住大家,人家的产品IC打磨了。我是靠猜测说是STC12C54的 ,因为他长的28个脚:3脚复位6 7脚晶振14脚地 18脚电源,难道是别的芯片? 不能修改ch cl修改比较寄寸器就可以了,直接加上翻转的时间,超过部分会自动截断 回复【17楼】hehanlou 何汉楼
-----------------------------------------------------------------------
如果再加上能串口烧写程序,那可能性会高些。只是一旦实验是真的,那板也无法还原回去了 回复【18楼】rlogin
-----------------------------------------------------------------------
能说详细点么,谢谢! 学习了... 回复【18楼】rlogin
不能修改ch cl修改比较寄寸器就可以了,直接加上翻转的时间,超过部分会自动截断
-----------------------------------------------------------------------
听君一言茅塞顿开。终于搞定,就是没加上翻转的时间。。。
结贴!放炮。。。。。:) 回复【楼主位】hehanlou 何汉楼
-----------------------------------------------------------------------
你用STC的下载软件 检测muc选项 如果是STC的产品都可以检测出来
页:
[1]