怎么输出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; //启动计数器
}
你这个不是高低电平切换,是间歇输出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 梁工 发表于 2023-9-5 17:36
你这个不是高低电平切换,是间歇输出PWM。
STC8H系列的高级PWM,连续输出0或1有2种方法(以PWM1P为例):
还是不太明白,有图示吗? 泰勒soc 发表于 2023-9-5 19:31
还是不太明白,有图示吗?
要什么图示?那直接就是程序啊!拷贝过去就可以了。 本帖最后由 odzz 于 2024-3-6 09:51 编辑
@梁工,请问PWM输出,极性控制是哪个寄存器。我一直找,没有看到!我是用于PWM-DCA的 odzz 发表于 2024-3-6 09:49
@梁工,请问PWM输出,极性控制是哪个寄存器。我一直找,没有看到!我是用于PWM-DCA的 ...
CCER寄存器
32G里面没有啊
看到了!下划线搞错了上划
页:
[1]