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

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

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:134
  • 最近打卡:2025-05-03 08:22:49

13

主题

65

回帖

598

积分

高级会员

积分
598
发表于 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;                        //启动计数器
}


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:134
  • 最近打卡:2025-05-03 08:22:49

13

主题

65

回帖

598

积分

高级会员

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

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

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

点评

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-03-08 08:06:49

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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

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

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

截图202403061024166221.jpg

CCER寄存器
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-03-08 08:06:49

0

主题

3

回帖

24

积分

新手上路

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2024-03-08 08:06:49

0

主题

3

回帖

24

积分

新手上路

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 12:49 , Processed in 0.126918 second(s), 98 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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