hehanlou 发表于 2011-10-18 14:50:16

别人的产品用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一个步进?

hehanlou 发表于 2011-10-18 15:23:39

木有人回答呢,,,,,

hehanlou 发表于 2011-10-18 18:04:10

等高人,,,,

eduhf_123 发表于 2011-10-18 18:31:11

假设单片机中时钟无倍频、定时器为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步进的。

可能的出路:倍频、抖动。

hehanlou 发表于 2011-10-18 18:54:01

那别人的产品是怎么实现的呢,,,,已经产量化了就是STC12C54的18脚输出来的。。

gongnn 发表于 2011-10-18 20:27:39

上 汇编

hehanlou 发表于 2011-10-18 20:39:59

上汇编真是恶梦!

hehanlou 发表于 2011-10-18 21:37:20

顶起了,

BXAK 发表于 2011-10-18 23:59:14

晕啊,放着可编程输出不用,用PCA干啥!!!

P1.0 可编程时钟输出CLKOUT0
P1.1 可编程时钟输出CLKOUT1

hehanlou 发表于 2011-10-19 08:15:10

STC12C54没有T2可编程时钟输出, 也就是说只有8位的可编程输出8位的精度想100HZ一个步进显然不够!STC90C系列的有T2可编程输出是16位,,,,但还是满足不了,,,

XA144F 发表于 2011-10-19 08:17:40

3L已经证明了,这根本不可能,除非用PLL。

hehanlou 发表于 2011-10-19 08:43:05

天啊,,,,我手头还有一个别人的产品,,,板子上面就一个芯片STC12C54,,,,人家怎么就能实现?

atl0402 发表于 2011-10-19 09:24:54

放图上来研究一下,怕什么

BXAK 发表于 2011-10-19 09:56:18

回复【9楼】hehanlou 何汉楼
-----------------------------------------------------------------------

看了3楼的分析,觉得真的无法精确到100Hz,

楼主把那板子上个图,示波器也抓几个图让大伙瞧瞧

agency 发表于 2011-10-19 10:22:41

汇编,不要用中断,固定延时法,可以做到一个指令周期的误差

takashiki 发表于 2011-10-19 10:57:50

对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,足够用了。

anguo 发表于 2011-10-19 11:49:04

用PCA的高速脉冲输出应该可以。步进100HZ不行。

hehanlou 发表于 2011-10-19 17:24:02

有点对不住大家,人家的产品IC打磨了。我是靠猜测说是STC12C54的 ,因为他长的28个脚:3脚复位6 7脚晶振14脚地 18脚电源,难道是别的芯片?

rlogin 发表于 2011-10-19 18:28:36

不能修改ch cl修改比较寄寸器就可以了,直接加上翻转的时间,超过部分会自动截断

BXAK 发表于 2011-10-19 19:22:19

回复【17楼】hehanlou 何汉楼
-----------------------------------------------------------------------

如果再加上能串口烧写程序,那可能性会高些。只是一旦实验是真的,那板也无法还原回去了

hehanlou 发表于 2011-10-19 20:28:58

回复【18楼】rlogin
-----------------------------------------------------------------------

能说详细点么,谢谢!

fei959671016 发表于 2011-10-19 21:53:51

学习了...

hehanlou 发表于 2011-10-19 23:14:48

回复【18楼】rlogin
不能修改ch cl修改比较寄寸器就可以了,直接加上翻转的时间,超过部分会自动截断
-----------------------------------------------------------------------

听君一言茅塞顿开。终于搞定,就是没加上翻转的时间。。。   

               结贴!放炮。。。。。:)

jgpiuu 发表于 2011-11-22 15:02:54

回复【楼主位】hehanlou 何汉楼
-----------------------------------------------------------------------

你用STC的下载软件 检测muc选项 如果是STC的产品都可以检测出来
页: [1]
查看完整版本: 别人的产品用STC12C54(30M的晶振)输出60Kz-65Kz的方波(100Hz一个步进),我调死也调不