STC12C5A60S2的PWM功能产生40KHz方波

[复制链接]
 楼主| 安燕 发表于 2013-5-11 14:29 | 显示全部楼层 |阅读模式
本帖最后由 安燕 于 2013-5-12 22:04 编辑

我现在需要用STC12C5A60S2单片机的PWM功能产生40KHz方波。我在芯片的数据手册里找到一个例子:
#include "reg51.h"
#include "intrins.h"
#define   FOSC      18432000L
typedef   unsigned   char    BYTE;
typedef   unsigned   int    WORD;
/*Declare SFR associated with the PCA */
sfr   CCON      =   0xD8;                 //PCA控制寄存器
sbit  CCF0      =   CCON^0;                //PCA模式0中断标志位
sbit  CCF1      =   CCON^1;                //PCA模式1中断标志位
sbit  CR        =   CCON^6;                //PCA定时器运行控制位
sbit  CF        =   CCON^7;                //PCA定时器溢出标志位
sfr   CMOD      =   0xD9;                 //PCA模式寄存器
sfr   CL        =   0xE9;                 //PCA时基低8位
sfr   CH        =   0xF9;                 //PCA时基高8位
sfr   CCAPM0    =   0xDA;                  //PCA单元0模式寄存器
sfr   CCAP0L    =   0xEA;                  //PCA单元0捕捉寄存器低8位
sfr   CCAP0H    =   0xFA;                 //PCA单元0捕捉寄存器高8位
sfr   CCAPM1    =   0xDB;                  //PCA单元1模式寄存器
sfr   CCAP1L    =   0xEB;                  //PCA单元1捕捉寄存器低8位
sfr   CCAP1H    =   0xFB;                  //PCA单元1捕捉寄存器高8位
sfr   PCAPWM0   =   0xf2;
sfr   PCAPWM1   =   0xf3;
void main()
{
      CCON = 0;                           //PCA控制寄存器初始化
                                          //PCA定时器停止运行
                                          //清楚CF标志位
                                          //清除全部单元中断标志位
      CL = 0;                             //PCA时基复位
      CH = 0;
      CMOD = 0x02;                        //设置PCA时钟源为FOSC/2
                                          //PCA时钟溢出不能使位
      CCAP0H = CCAP0L = 0x80;           //PWM0输出占空比为50%
      CCAPM0 = 0x42;                      //PCA工作在8bit模式
                                         //PCA不中断
      CCAP1H = CCAP1L = 0xff;            //PWM 输出占空比0%
      PCAPWM1 = 0x03;
      CCAPM1 = 0x42;                      //PCA工作在8bit模式
                                             //PCA不中断
       CR =  1;                              //PCA定时启动
    while ( 1);
}
我不知道要在哪里写入我需要的频率?
由于PWM是8位的,所以 PWM的频率=PCA 时钟输入源频率/256
PCA 时钟输入源可以从以下8种中选择一种:SYSclk,         SYSclk/2 , SYSclk/4 ,SYSclk/6 ,SYSclk/8 ,SYSclk/2,定时器0的溢出,ECI/P3.4 输入。
CMOD = 0x02;那我选用的PCA时钟输入源就是SYSclk/2,我根据上述公式计算出SYSclk的值后在程序的那个地方写入?
求高手指点,如果有类似的程序和电路图分享的话就更好了。先谢谢了。
Jackson_lv 发表于 2013-5-11 14:54 | 显示全部楼层
我前几天刚试过,只能输出38点几或者41点几KHz 的方波。改用定时器0可编程时钟输出方式,把晶振换成24Mhz的可以输出40.005Khz的方波

评分

参与人数 1威望 +1 收起 理由
安燕 + 1 很给力!

查看全部评分

 楼主| 安燕 发表于 2013-5-11 15:27 | 显示全部楼层
Jackson_lv 发表于 2013-5-11 14:54
我前几天刚试过,只能输出38点几或者41点几KHz 的方波。改用定时器0可编程时钟输出方式,把晶振换成24Mhz的 ...

老师说晶振要用11.0592MHz或者12MHz的。40KHz左右都可以的。我做的是PWM信号源驱动超声换能器发射,有点误差也没事。如果可以能不能把你的程序和电路图发给我借鉴一下。我的邮箱474866320@qq.com万分感谢!
Jackson_lv 发表于 2013-5-11 21:57 | 显示全部楼层
安燕 发表于 2013-5-11 15:27
老师说晶振要用11.0592MHz或者12MHz的。40KHz左右都可以的。我做的是PWM信号源驱动超声换能器发射,有点 ...

嗯嗯,发了,不懂的话可以问我吧
 楼主| 安燕 发表于 2013-5-12 12:05 | 显示全部楼层
Jackson_lv 发表于 2013-5-11 21:57
嗯嗯,发了,不懂的话可以问我吧

谢谢你了。这边还缺一个.c文件,你有空的时候再给我发一下吧。谢谢你。
为一位奶奶 发表于 2014-4-8 18:28 | 显示全部楼层
如果用一组数列产生PWM波,改变频率时怎样计算数据啊
armxu 发表于 2014-4-8 22:05 来自手机 | 显示全部楼层
你要的是占脉冲?
mengyingtt 发表于 2014-4-30 13:00 | 显示全部楼层
Jackson_lv 发表于 2013-5-11 21:57
嗯嗯,发了,不懂的话可以问我吧

你可以把程序发给我看一下么,我用的是24M晶振,253455397@qq.com,非常感谢
coody 发表于 2014-4-30 15:36 | 显示全部楼层
LZ不是都看到了么?
PWM的频率 = PCA 时钟输入源频率/256。

CCAP0H = CCAP0L = 0x80;  //PWM0输出占空比为50%
Hhhhlnlnlnh 发表于 2015-5-8 11:00 | 显示全部楼层
STC12系列单片机用PWM能产生1M方波吗,接上外部晶振24M
xuling425300 发表于 2015-5-12 15:32 | 显示全部楼层
要用T0定时器溢出作为时钟源,这样就可以在C语言里计算出想要的频率,,可以随便用什么晶振4M  6M 8M 11M 12M 25M都可以,因为可以进行时钟分频/2/4/8/16//31/64/
coody 发表于 2015-5-12 21:47 | 显示全部楼层
Hhhhlnlnlnh 发表于 2015-5-8 11:00
STC12系列单片机用PWM能产生1M方波吗,接上外部晶振24M

使用PWM不能输出那么快的脉冲,要使用定时器告诉脉冲输出功能,如果用24M时钟,定时器8位自动重装,则可以输出12000000/n HZ,n=1,2,.... 255。STC15系列的MCU的定时器有16位自动重装,则频率范围更宽。
kuangren321 发表于 2016-7-15 23:28 | 显示全部楼层
coody 发表于 2015-5-12 21:47
使用PWM不能输出那么快的脉冲,要使用定时器告诉脉冲输出功能,如果用24M时钟,定时器8位自动重装,则可 ...

请问代码如何实现1MHZ的PWM,能提供一下源代码吗?543623347@qq.com
guokeyan0 发表于 2016-7-20 16:18 | 显示全部楼层
楼主能看下你pca那块的代码么,最近我在看波形产生的资料,pca稍微有点迷。谢谢了404182248@qq.com
coody 发表于 2016-7-22 14:52 | 显示全部楼层
kuangren321 发表于 2016-7-15 23:28
请问代码如何实现1MHZ的PWM,能提供一下源代码吗?

STC12C5A60S2的PWM不能输出1MHZ的PWM,其最快PWM频率=fosc/256。使用25.6M可以输出100KHZ的8位PWM。
Mr灬自在 发表于 2016-12-10 15:29 | 显示全部楼层
怎么用定时器改变频率?
levii 发表于 2023-1-7 15:19 | 显示全部楼层
请问能发一下最终产生方波的程序吗?我想参考一下
2678217696@qq.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

30

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部