标题: 请问STC15W408AS单片机PCA输出为什么只是1Hz,附程序 [打印本页]

作者: litingkun    时间: 2021-8-30 22:13
标题: 请问STC15W408AS单片机PCA输出为什么只是1Hz,附程序
以上是我写的一程序,想要输出100Hz脉冲,接了个LED大概1秒闪一下。修改T100Hz频率不会有变化。改CMOD的PCA时钟源也没变化。只有改CLK_DIV才变。

#include <reg51.h>



#define FOSC    11059200L
#define T100Hz (FOSC / 4 / 27648)

#define CCP_S0 0x00                 //P_SW1.4
#define CCP_S1 0x00                 //P_SW1.5
sfr CLK_DIV=0x97;

typedef unsigned int WORD;

void main()
{                           
WORD value;

CLK_DIV=0x02;                 
P1M0 = 0x00;
P1M1 = 0x00;

                                       //CCP_S0=0 CCP_S1=0
P_SW1 = 0;                    //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)

CCON = 0;                       //初始化PCA控制寄存器
                                //PCA定时器停止
                                //清除CF标志
                                //清除模块中断标志
CL = 0;                         //复位PCA寄存器
CH = 0;
CMOD = 0x01;                    //设置PCA时钟源
value = T100Hz;
CCAP0L = value;                 //P1.1输出100KHz方波
CCAP0H = value >> 8;            //初始化PCA模块0
CCAPM0 = 0x4d;                  //PCA模块0为16位定时器模式,同时反转CEX0(P1.3)口
CR=1;                                                            //一定要这个要不然不输出!!!!!!!!!!!!!!   不中断就能不断输出了

while (1);
}


作者: wulin    时间: 2021-8-31 07:18
STC官方有现成的示例,时钟11.0592MHz的条件下修改计算公式“#define T38K4HZ   (11059200L / 2 / 38400)”可以输出脉冲频率85Hz~5.5MHz。




作者: man1234567    时间: 2021-8-31 08:28
100HZ楼主肉眼可分辨出闪么
作者: litingkun    时间: 2021-8-31 08:51
100Hz分辨不出,但1Hz是可以的。
作者: litingkun    时间: 2021-8-31 08:52
估计是数值太大从溢出了。
作者: wfqxgw    时间: 2021-8-31 09:01
记得这个PAC是8位的。所以数值最大只能255
作者: litingkun    时间: 2021-8-31 09:21
wfqxgw 发表于 2021-8-31 09:01
记得这个PAC是8位的。所以数值最大只能255

16位的计数器
作者: wfqxgw    时间: 2021-8-31 13:45
litingkun 发表于 2021-8-31 09:21
16位的计数器

16位只是计数吧。用做PWM输出时,只有8位的PWM点空比设置值。。EPCnL,CCAPnL[7:0]
作者: litingkun    时间: 2021-8-31 19:20
本帖最后由 litingkun 于 2021-8-31 19:34 编辑

程序我又改了一下,之前的中断没有把计数值重新增加后再写入。试了一下T100Hz常量的频率设置为6400是转速正常,设置为12800是电机反向转,速度也变慢下来,真不知什么原因。电机是1600个脉冲1圈。
#include <reg51.h>
#define FOSC    11059200L
#define T100Hz  FOSC/2/12800                    //设置为6400就正常
#define CCP_S0 0x00                 //P_SW1.4
#define CCP_S1 0x00                 //P_SW1.5
sfr CLK_DIV=0x97;

typedef unsigned int WORD;


WORD value;
void PCA_isr() interrupt 7
{
    CCF0 = 0;
        CCAP0L = value;
    CCAP0H = value >> 8;
    value += T100Hz;
}

void main()
{                           

P12=1;
CLK_DIV=0x00;                 
P1M0 = 0x00;
P1M1 = 0x00;

      //CCP_S0=0 CCP_S1=0
P_SW1 = 0;                    //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)

CCON = 0;                       //初始化PCA控制寄存器
                                //PCA定时器停止
                                //清除CF标志
                                //清除模块中断标志
CL = 0;                         //复位PCA寄存器
CH = 0;
CMOD = 0x08;                    //设置PCA时钟源
value = T100Hz;
CCAP0L = value;                 //P1.1输出100KHz方波
CCAP0H = value >> 8;            //初始化PCA模块0
value += T100Hz;
CCAPM0 = 0x4d;                  //PCA模块0为16位定时器模式,同时反转CEX0(P1.3)口
CR=1;                                                            //一定要这个要不然不输出!!!!!!!!!!!!!!   不中断就能不断输出了
EA = 1;
while (1);
}
作者: suqianfu    时间: 2025-1-21 21:10
#define T100Hz  FOSC/2/12800                    //这个参数设置错误的.100HZ的话应该是FOSC/4/100 即频率是11.0592Mhz下是11059200/4/100=27648这个参数.或者直接填




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1