找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1653|回复: 8
打印 上一主题 下一主题
收起左侧

请问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);
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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



评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:584814 发表于 2021-8-31 08:28 | 只看该作者
100HZ楼主肉眼可分辨出闪么
回复

使用道具 举报

地板
ID:961122 发表于 2021-8-31 08:51 | 只看该作者
100Hz分辨不出,但1Hz是可以的。
回复

使用道具 举报

5#
ID:961122 发表于 2021-8-31 08:52 | 只看该作者
估计是数值太大从溢出了。
回复

使用道具 举报

6#
ID:419909 发表于 2021-8-31 09:01 | 只看该作者
记得这个PAC是8位的。所以数值最大只能255
回复

使用道具 举报

7#
ID:961122 发表于 2021-8-31 09:21 | 只看该作者
wfqxgw 发表于 2021-8-31 09:01
记得这个PAC是8位的。所以数值最大只能255

16位的计数器
回复

使用道具 举报

8#
ID:419909 发表于 2021-8-31 13:45 | 只看该作者

16位只是计数吧。用做PWM输出时,只有8位的PWM点空比设置值。。EPCnL,CCAPnL[7:0]
回复

使用道具 举报

9#
ID:961122 发表于 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);
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表