找回密码
 立即注册
查看: 1021|回复: 5

关于STC32高级PWM的定时功能使用

[复制链接]

该用户从未签到

2

主题

2

回帖

66

积分

注册会员

积分
66
发表于 2023-8-13 20:28:33 | 显示全部楼层 |阅读模式
各位老师好!

想请教一下关于STC32的高级PWM定时器功能,官方说具备8个通道的PWM,想知道是否可以配置成8个单独的普通定时器功能使用,解答一下实现方式。谢谢大家!
回复 送花

使用道具 举报

  • TA的每日心情
    奋斗
    10 小时前
  • 签到天数: 139 天

    [LV.7]常住居民III

    26

    主题

    1331

    回帖

    4143

    积分

    论坛元老

    积分
    4143
    发表于 2023-8-14 09:30:29 | 显示全部楼层
    利用STC32的2组高级PWM计数器溢出中断可以实现2个定时器功能,具体用法请参考附件例子。

    利用高级PWM中断做定时器-STC32G.zip

    14.7 KB, 下载次数: 41

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    无聊
    2024-5-2 21:48
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    3

    主题

    28

    回帖

    343

    积分

    中级会员

    积分
    343
    发表于 2023-8-14 10:14:06 | 显示全部楼层
    乘风飞扬 发表于 2023-8-14 09:30
    利用STC32的2组高级PWM计数器溢出中断可以实现2个定时器功能,具体用法请参考附件例子。 ...

    请教下前辈这类寄存器代码的STC32例程要哪里下载? 我喜欢这类代码不喜欢官网的库函数例程牵扯太多调用.

    点评

    可以参考下STC32G实验箱V9.6的范例程序  详情 回复 发表于 2023-8-14 10:25
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    5

    主题

    48

    回帖

    818

    积分

    版主

    积分
    818
    发表于 2023-8-14 10:25:13 | 显示全部楼层
    qq603599910 发表于 2023-8-14 10:14
    请教下前辈这类寄存器代码的STC32例程要哪里下载? 我喜欢这类代码不喜欢官网的库函数例程牵扯太多调用. ...

    可以参考下STC32G实验箱V9.6的范例程序
    ){{P$CPT94YS``W{HL7_2D1.png

    STC32G-DEMO-CODE-V9.6-20230425.zip

    27.93 MB, 下载次数: 26

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3002

    回帖

    6767

    积分

    超级版主

    积分
    6767
    发表于 2023-8-14 10:55:31 | 显示全部楼层
    使用比较模式,每一路PWM都可以做一个16位的定时器,所以8路PWM可以做8个相互独立的16位定时器(但同一组PWM的时钟都相同)。下面的例子,匹配翻转还可以输出一个时钟,如果不需要这个输出,禁止掉(初始化时不允许)即可。
    1.png

    STC32G-高级PWM相关程序.rar (1.58 MB, 下载次数: 21)

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9418

    回帖

    1万

    积分

    管理员

    积分
    13981
    发表于 2023-8-14 18:19:13 | 显示全部楼层
    参考下面这个程序,STC8H8K64U,
    [ PWMA+PWMB ],
    [ PWM1,PWM2,PWM3,PWM4,PWM5,PWM6,PWM7,PWM8 ] 做8路定时器



    /* --- BBS: www.STCAIMCU.com  -----------------------------------------*/
    /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */

    /*---------------------------------------------------------------------*/


    /*************  功能说明    **************

    本例程基于STC8H8K64U为主控芯片的实验箱9进行编写测试,STC8H系列芯片可通用参考.

    利用高级PWMA/PWMB中断实现8个定时器功能.

    PWMA的时钟频率为 SYSclk/2
    PWMA通道1:定时周期 1ms
    PWMA通道2:定时周期 2ms
    PWMA通道3:定时周期 4ms
    PWMA通道4:定时周期 5ms

    PWMA的时钟频率为 SYSclk/10000
    PWMB通道1:定时周期 1s
    PWMB通道2:定时周期 2s
    PWMB通道3:定时周期 3s
    PWMB通道4:定时周期 4s

    下载时, 选择时钟 24MHZ (用户可自行修改频率).

    ******************************************/

    #include    "stc8h.h"
    #include    "intrins.h"

    #define     MAIN_Fosc       24000000L   //定义主时钟

    #define     PSCRA           2
    #define     PWMA_T1         MAIN_Fosc/PSCRA/1000    //定时周期 1ms(1KHz)
    #define     PWMA_T2         MAIN_Fosc/PSCRA/500     //定时周期 2ms(500Hz)
    #define     PWMA_T3         MAIN_Fosc/PSCRA/250     //定时周期 4ms(250Hz)
    #define     PWMA_T4         MAIN_Fosc/PSCRA/200     //定时周期 5ms(200Hz)

    #define     PSCRB           10000
    #define     PWMB_T5         MAIN_Fosc/PSCRB*1       //定时周期 1s
    #define     PWMB_T6         MAIN_Fosc/PSCRB*2       //定时周期 2s
    #define     PWMB_T7         MAIN_Fosc/PSCRB*3       //定时周期 3s
    #define     PWMB_T8         MAIN_Fosc/PSCRB*4       //定时周期 4s

    typedef     unsigned char   u8;
    typedef     unsigned int    u16;
    typedef     unsigned long   u32;

    /*****************************************************************************/

    void PWMA_Timer();
    void PWMB_Timer();

    u16 cnt1;
    u16 cnt2;
    u16 cnt3;
    u16 cnt4;
    u16 cnt5;
    u16 cnt6;
    u16 cnt7;
    u16 cnt8;

    /******************** 主函数 **************************/
    void main(void)
    {
        P_SW2 |= 0x80;                  //扩展寄存器(XFR)访问使能

            P0M1 = 0x00;   P0M0 = 0x00;     //设置为准双向口
            P1M1 = 0x00;   P1M0 = 0x00;     //设置为准双向口
            P2M1 = 0x00;   P2M0 = 0x00;     //设置为准双向口
            P3M1 = 0x00;   P3M0 = 0x00;     //设置为准双向口
            P4M1 = 0x00;   P4M0 = 0x00;     //设置为准双向口
            P5M1 = 0x00;   P5M0 = 0x00;     //设置为准双向口
            P6M1 = 0x00;   P6M0 = 0x00;     //设置为准双向口
            P7M1 = 0x00;   P7M0 = 0x00;     //设置为准双向口

            PWMA_Timer();
            PWMB_Timer();

            P40 = 0;                                //给LED供电
            EA = 1;                         //打开总中断

            while (1);
    }

    //========================================================================
    // 函数: void PWMA_Timer()
    // 描述: PWMA配置函数.
    // 参数: None
    // 返回: none.
    // 版本: V1.0, 2021-02-08
    //========================================================================
    void PWMA_Timer()
    {
            PWMA_PSCR = PSCRA-1;        //设置预分频器
            PWMA_ARR = 0xffff;
        PWMA_CCER1 = 0x00;
        PWMA_CCMR1 = 0x00;
        PWMA_CCMR2 = 0x00;
        PWMA_CCMR3 = 0x00;
        PWMA_CCMR4 = 0x00;
        cnt1 = PWMA_CCR1 = PWMA_T1;
        cnt2 = PWMA_CCR2 = PWMA_T2;
        cnt3 = PWMA_CCR3 = PWMA_T3;
        cnt4 = PWMA_CCR4 = PWMA_T4;
            PWMA_IER = 0x1e;            // 使能中断
            PWMA_CR1 |= 0x81;           //使能ARR预装载,开始计时
       
        cnt1 += PWMA_T1;
        cnt2 += PWMA_T2;
        cnt3 += PWMA_T3;
        cnt4 += PWMA_T4;
    }

    //========================================================================
    // 函数: void PWMB_Timer()
    // 描述: PWMB配置函数.
    // 参数: None
    // 返回: none.
    // 版本: V1.0, 2021-02-08
    //========================================================================
    void PWMB_Timer()
    {
            PWMB_PSCR = PSCRB-1;          //设置预分频器
            PWMB_ARR = 0xffff;      //设置周期时间
        PWMB_CCER1 = 0x00;
        PWMB_CCMR1 = 0x00;      //设置冻结模式
        PWMB_CCMR2 = 0x00;      //设置冻结模式
        PWMB_CCMR3 = 0x00;      //设置冻结模式
        PWMB_CCMR4 = 0x00;      //设置冻结模式
        cnt5 = PWMB_CCR5 = PWMB_T5;
        cnt6 = PWMB_CCR6 = PWMB_T6;
        cnt7 = PWMB_CCR7 = PWMB_T7;
        cnt8 = PWMB_CCR8 = PWMB_T8;
            PWMB_IER = 0x1e;        // 使能中断
            PWMB_CR1 |= 0x81;       //使能ARR预装载,开始计时
       
        cnt5 += PWMB_T5;
        cnt6 += PWMB_T6;
        cnt7 += PWMB_T7;
        cnt8 += PWMB_T8;
    }

    //========================================================================
    // 函数: PWMA_ISR() interrupt 26
    // 描述: PWMA中断函数.
    // 参数: None
    // 返回: none.
    // 版本: V1.0, 2020-12-04
    //========================================================================
    void PWMA_ISR() interrupt 26
    {
        u8 sr;
       
        sr = PWMA_SR1;
        PWMA_SR1 = 0;
       
        if (sr & 0x02)
        {
            PWMA_CCR1 = cnt1;
            cnt1 += PWMA_T1;
            P20 = ~P20;
            P60 = ~P60;
        }
        if (sr & 0x04)
        {
            PWMA_CCR2 = cnt2;
            cnt2 += PWMA_T2;
            P21 = ~P21;
            P61 = ~P61;
        }
        if (sr & 0x08)
        {
            PWMA_CCR3 = cnt3;
            cnt3 += PWMA_T3;
            P22 = ~P22;
            P62 = ~P62;
        }
        if (sr & 0x10)
        {
            PWMA_CCR4 = cnt4;
            cnt4 += PWMA_T4;
            P23 = ~P23;
            P63 = ~P63;
        }
    }

    //========================================================================
    // 函数: PWMB_ISR() interrupt 27
    // 描述: PWMB中断函数.
    // 参数: None
    // 返回: none.
    // 版本: V1.0, 2020-12-04
    //========================================================================
    void PWMB_ISR() interrupt 27
    {
        u8 sr;
       
        sr = PWMB_SR1;
        PWMB_SR1 = 0;
       
        if (sr & 0x02)
        {
            PWMB_CCR5 = cnt5;
            cnt5 += PWMB_T5;
            P24 = ~P24;
            P64 = ~P64;
        }
        if (sr & 0x04)
        {
            PWMB_CCR6 = cnt6;
            cnt6 += PWMB_T6;
            P25 = ~P25;
            P65 = ~P65;
        }
        if (sr & 0x08)
        {
            PWMB_CCR7 = cnt7;
            cnt7 += PWMB_T7;
            P26 = ~P26;
            P66 = ~P66;
        }
        if (sr & 0x10)
        {
            PWMB_CCR8 = cnt8;
            cnt8 += PWMB_T8;
            P27 = ~P27;
            P67 = ~P67;
        }
    }



    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-13 19:09 , Processed in 0.065969 second(s), 55 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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