查看: 99|回复: 1

STC12C5A16S2如何利用单片机自带PWM功能发出1KHZ波形

[复制链接]
  • TA的每日心情
    萌哒
    2018-11-23 18:24
  • 25

    主题

    99

    帖子

    2082

    积分

    实习版主

    Rank: 7Rank: 7Rank: 7

    积分
    2082
    发表于 2018-11-28 10:02:35 | 显示全部楼层 |阅读模式
    呆萌侠电子至尊编码器
    本帖最后由 Lls 于 2018-11-28 10:04 编辑

    (此问题给已经看了很多资料,并且不知道最终怎么实现PWM输出利用定时器0设置的同学)

    熟读技术手册可得,控制PWM输出频率的是CMOD寄存器其中的三位:
    12333.jpg
    除了  010011两种,其他均为系统时钟直接分频。
    例如:如果这三位为000时。PWM的时钟源是SYSclk/12PWM频率=11059200/12/256=3600。即为3.6KHZ
    按照这种方法我们的PWM频率仅仅只能是6种情况:不分频,2分频,4分频,6分频,8分频和12分频。其中最大频率是不分频情况 PWM频率=11059200/256=43200。频率为43.2KHZ(如图1)。最小频率为12分频下3.6K(如图2)。
    433333.jpg
    图1  不分频PWM频率最大情况
    333.jpg
    图2  12分频后PWM频率
    如果我们想获得其他频率的PWM,我们需要使用T0或者外部时钟,在不改硬件的情况下,我们使用010,也就是定时器0溢出脉冲的办法。STC单片机是1T单片机,但是它的定时器默认是12T,我们需要设置AUXR的最高位为1让定时器0工作在1T模式下。此时我们想获得1KHZ的频率我们应该对定时器0进行配置,首先设置定时器0的工作模式为8位自动装初值模式:TMOD|=0x02;然后给TH0设置初值。
    在定时器0溢出的模式下,PWM频率=CLK/256。CLK=11059200/(256-TH0)当PWM频率要为1000时,此时算出TH0约等于213。那么直接设置TH0=213;即可。最后使能定时器0:TR0=1;最终定时器部分的初始化,和CMOD的初始化为:

    AUXR|=0x80;
    TMOD|=0X02;
    TH0=213;
    TR0=1;
    CMOD=0x04;
    最终效果如图3:
    1看、.jpg
    图3 使用T0溢出分频方式发出1KHZ波形

    STC12C5A16S2的P1.3端口发出1KHZ波形完整代码:
    #include <STC5A60S2.H>
    void main()
    {                                    
    AUXR|=0x80;
    TMOD|=0X02;
    TH0=213;
    TR0=1;

    CCON=0;                                
    CL=0;        CH=0;                           
    CMOD=0x04;                 
    CCAP0H=CCAP0L=0xFF;  
    CCAPM0=0x42;                           
    CR=1;                                             
    while(1)
    {
    CCAP0H=0x80;
    }

    }

    回复

    使用道具 举报

  • TA的每日心情
    萌哒
    2018-11-23 18:24
  • 25

    主题

    99

    帖子

    2082

    积分

    实习版主

    Rank: 7Rank: 7Rank: 7

    积分
    2082
     楼主| 发表于 2018-11-28 10:03:54 | 显示全部楼层
    呆萌侠电子至尊编码器
    希望大家多看技术手册,多从原理出发!~
    回复

    使用道具 举报

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

    本版积分规则

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