找回密码
 立即注册
查看: 384|回复: 7

怎么输出PWM,达到高低电平不停切换的效果?

[复制链接]
  • TA的每日心情
    开心
    2024-4-28 19:56
  • 签到天数: 61 天

    [LV.6]常住居民II

    13

    主题

    64

    回帖

    335

    积分

    中级会员

    积分
    335
    发表于 2023-9-5 16:41:12 | 显示全部楼层 |阅读模式
    本帖最后由 泰勒soc 于 2023-9-5 16:52 编辑

    求大神看看我的代码,需求是通过PWM4P这个引脚输出一个周期1s,占空比50%的方波。用来做有源蜂鸣器的报警效果不知道对不对??????????????
    型号STC8H1K08-SOP16

    STC8H1K08管脚图.png


    #include "../SOFTWARE/PWM.h"


    #define PWM_ARR 999        // 1/1000s * 1000 =1s
    #define PWM_CCR 499   //499
    #define PWM_PSC 23999        //24000000 / 24000 = 1000Hz

    //========================================================================
    // 函数名称: PWMA_Init
    // 函数功能: p16端口输出一个PWM信号
    // 入口参数: 无
    // 函数返回: 无
    // 当前版本: VER1.0
    // 修改日期: 2023
    // 当前作者:
    // 其他备注:
    //输出频率   = sysclk(22.1184mhz)/(pscr+1)/(arr+1) = 22118400 / 1 / ( 999+1) = 22118.4hz = 22.1184khz
    //输出占空比 = ccr/( arr+1 )*100% = 500/( 999+1) = 50%
    //========================================================================
    void PWMA_Init(void)                        //PWMA的初始化
    {
            //1.时钟源选择
            
            //2.时基单元选择
            PWMA_PSCRH = (u8)(PWM_PSC>>8);        //65535+1分频
            PWMA_PSCRL = (u8)(PWM_PSC);
            
            PWMA_ARRH  = (u8)(PWM_ARR>>8);        //自动装载值设置周期时间
            PWMA_ARRL  = (u8)(PWM_ARR);
            
            PWMA_CCR4H  = (u8)(PWM_CCR>>8);//设置占空比时间
            PWMA_CCR4L  = (u8)(PWM_CCR);        
            
            
            //3.输入输出的引脚配置
            PWMA_ENO = 0X00;                        //使能PWM4P通道输出,P16引脚
            PWMA_ENO |= 0X40;
            
            PWMA_PS = 0x00;                                //选择PWM4输出
            PWMA_PS &= 0x3f;
            
            //4.输入输出模式设置
            PWMA_CCER2 = 0X00;
            PWMB_CCMR4 = 0x68;                        // 通道模式配置, PWM模式1, 预装载允许
            PWMB_CCER2 |= 0x10;                        // 开启比较输出CC4E, 高电平有效00010000
            
    //        PWMB_IER |= 0x10;                        // 使能中断
            
            PWMB_EGR = 0x01;                 //产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
            
            PWMA_BKR = 0X80;                        //使能主输出
            
            PWMA_CR1 |= 0X81;                        //启动计数器
    }


    回复 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2963

    回帖

    6679

    积分

    超级版主

    积分
    6679
    发表于 2023-9-5 17:36:48 | 显示全部楼层
    你这个不是高低电平切换,是间歇输出PWM。

    STC8H系列的高级PWM,连续输出0或1有2种方法(以PWM1P为例):

    1、使用PWMx_ENO禁止输出PWM,对应IO成为普通IO,禁止PWM输出后,由这个IO直接输出高或低电平。
      PWMA_ENO |= 0x01;   // 允许PWM1P输出
      delay_ms(5);        // P1.0输出PWM 5ms
      P10 = 1;            // P1.0输出高电平
      PWMA_ENO &= ~0x01;  // 关闭PWM输出
      delay_ms(5);        // P1.0输出高电平5ms
                   
      PWMA_ENO |= 0x01;   // 允许PWM1P输出
      delay_ms(5);        // P1.0输出PWM 5ms
      P10 = 0;            // P1.0输出低电平
      PWMA_ENO &= ~0x01;  // 关闭PWM输出
      delay_ms(5);        // P1.0输出高电平5ms

    2、设置PWMx_CCMRn,强制PWM输出有效(高)电平/无效(低)电平。
      PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x60;  // PWM正常输出
      delay_ms(5);                               // PWM输出5ms
      PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x40;  // 强制PWM输出无效(低)电平
      delay_ms(5);                               // PWM输出低电平5ms
      PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x60;  // PWM正常输出
      delay_ms(5);                               // PWM输出5ms
      PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x50;  //强制PWM输出有效(高)电平
      delay_ms(5);                               // PWM输出高电平5ms
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-28 19:56
  • 签到天数: 61 天

    [LV.6]常住居民II

    13

    主题

    64

    回帖

    335

    积分

    中级会员

    积分
    335
     楼主| 发表于 2023-9-5 19:31:29 | 显示全部楼层
    梁工 发表于 2023-9-5 17:36
    你这个不是高低电平切换,是间歇输出PWM。

    STC8H系列的高级PWM,连续输出0或1有2种方法(以PWM1P为例):

    还是不太明白,有图示吗?

    点评

    要什么图示?那直接就是程序啊!拷贝过去就可以了。  详情 回复 发表于 2023-9-5 22:25
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2963

    回帖

    6679

    积分

    超级版主

    积分
    6679
    发表于 2023-9-5 22:25:42 | 显示全部楼层
    泰勒soc 发表于 2023-9-5 19:31
    还是不太明白,有图示吗?

    要什么图示?那直接就是程序啊!拷贝过去就可以了。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-8 08:06
  • 签到天数: 2 天

    [LV.1]初来乍到

    0

    主题

    3

    回帖

    24

    积分

    新手上路

    积分
    24
    发表于 2024-3-6 09:49:52 | 显示全部楼层
    本帖最后由 odzz 于 2024-3-6 09:51 编辑

    @梁工,请问PWM输出,极性控制是哪个寄存器。我一直找,没有看到!我是用于PWM-DCA的

    点评

    [attachimg]37137[/attachimg] CCER寄存器  详情 回复 发表于 2024-3-6 10:24
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 10:08
  • 签到天数: 92 天

    [LV.6]常住居民II

    38

    主题

    989

    回帖

    6789

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6789
    QQ
    发表于 2024-3-6 10:24:26 | 显示全部楼层
    odzz 发表于 2024-3-6 09:49
    @梁工,请问PWM输出,极性控制是哪个寄存器。我一直找,没有看到!我是用于PWM-DCA的 ...

    截图202403061024166221.jpg

    CCER寄存器
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-8 08:06
  • 签到天数: 2 天

    [LV.1]初来乍到

    0

    主题

    3

    回帖

    24

    积分

    新手上路

    积分
    24
    发表于 2024-3-6 11:13:14 | 显示全部楼层
    32G里面没有啊
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-8 08:06
  • 签到天数: 2 天

    [LV.1]初来乍到

    0

    主题

    3

    回帖

    24

    积分

    新手上路

    积分
    24
    发表于 2024-3-6 11:15:48 | 显示全部楼层
    看到了!下划线搞错了上划
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-8 06:03 , Processed in 0.072814 second(s), 65 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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