21ic电子技术开发论坛 单片机与嵌入式系统 侃单片机论坛 STC12C5A60S2的PWM功能产生40KHz方波
发新帖我要提问
返回列表
打印

STC12C5A60S2的PWM功能产生40KHz方波

[复制链接]
11236|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
安燕|  楼主 | 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信号源驱动超声换能器发射,有点 ...

嗯嗯,发了,不懂的话可以问我吧

使用特权

评论回复
5
安燕|  楼主 | 2013-5-12 12:05 | 只看该作者
Jackson_lv 发表于 2013-5-11 21:57
嗯嗯,发了,不懂的话可以问我吧

谢谢你了。这边还缺一个.c文件,你有空的时候再给我发一下吧。谢谢你。

使用特权

评论回复
6
为一位奶奶| | 2014-4-8 18:28 | 只看该作者
如果用一组数列产生PWM波,改变频率时怎样计算数据啊

使用特权

评论回复
7
armxu| | 2014-4-8 22:05 | 只看该作者
你要的是占脉冲?

使用特权

评论回复
8
mengyingtt| | 2014-4-30 13:00 | 只看该作者
Jackson_lv 发表于 2013-5-11 21:57
嗯嗯,发了,不懂的话可以问我吧

你可以把程序发给我看一下么,我用的是24M晶振,253455397@qq.com,非常感谢

使用特权

评论回复
9
coody| | 2014-4-30 15:36 | 只看该作者
LZ不是都看到了么?
PWM的频率 = PCA 时钟输入源频率/256。

CCAP0H = CCAP0L = 0x80;  //PWM0输出占空比为50%

使用特权

评论回复
10
Hhhhlnlnlnh| | 2015-5-8 11:00 | 只看该作者
STC12系列单片机用PWM能产生1M方波吗,接上外部晶振24M

使用特权

评论回复
11
xuling425300| | 2015-5-12 15:32 | 只看该作者
要用T0定时器溢出作为时钟源,这样就可以在C语言里计算出想要的频率,,可以随便用什么晶振4M  6M 8M 11M 12M 25M都可以,因为可以进行时钟分频/2/4/8/16//31/64/

使用特权

评论回复
12
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位自动重装,则频率范围更宽。

使用特权

评论回复
13
kuangren321| | 2016-7-15 23:28 | 只看该作者
coody 发表于 2015-5-12 21:47
使用PWM不能输出那么快的脉冲,要使用定时器告诉脉冲输出功能,如果用24M时钟,定时器8位自动重装,则可 ...

请问代码如何实现1MHZ的PWM,能提供一下源代码吗?543623347@qq.com

使用特权

评论回复
14
guokeyan0| | 2016-7-20 16:18 | 只看该作者
楼主能看下你pca那块的代码么,最近我在看波形产生的资料,pca稍微有点迷。谢谢了404182248@qq.com

使用特权

评论回复
15
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。

使用特权

评论回复
16
Mr灬自在| | 2016-12-10 15:29 | 只看该作者
怎么用定时器改变频率?

使用特权

评论回复
17
levii| | 2023-1-7 15:19 | 只看该作者
请问能发一下最终产生方波的程序吗?我想参考一下
2678217696@qq.com

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

30

帖子

1

粉丝
关闭 热门推荐
快速回复 在线客服 返回列表 返回顶部