泰勒soc 发表于 2023-9-5 16:41:12

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

本帖最后由 泰勒soc 于 2023-9-5 16:52 编辑

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




#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;                        //启动计数器
}


梁工 发表于 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

泰勒soc 发表于 2023-9-5 19:31:29

梁工 发表于 2023-9-5 17:36
你这个不是高低电平切换,是间歇输出PWM。

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


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

梁工 发表于 2023-9-5 22:25:42

泰勒soc 发表于 2023-9-5 19:31
还是不太明白,有图示吗?

要什么图示?那直接就是程序啊!拷贝过去就可以了。

odzz 发表于 2024-3-6 09:49:52

本帖最后由 odzz 于 2024-3-6 09:51 编辑

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

电子DIY小家 发表于 2024-3-6 10:24:26

odzz 发表于 2024-3-6 09:49
@梁工,请问PWM输出,极性控制是哪个寄存器。我一直找,没有看到!我是用于PWM-DCA的 ...



CCER寄存器

odzz 发表于 2024-3-6 11:13:14

32G里面没有啊

odzz 发表于 2024-3-6 11:15:48

看到了!下划线搞错了上划
页: [1]
查看完整版本: 怎么输出PWM,达到高低电平不停切换的效果?