硬件PWM设置后,无波形输出
单片机型号:STC8H4K64TL 使能3P (P2.4) 4P(P2.6)#include "moto_pwm.h"
#include "STC8H_PWM.h"
u8 p3_duty=100;
u8 p4_duty=100;
/***************PWM始化函数 *****************/
#define PWM3_2 0x10 //P:P2.4N:P2.5 //
#define PWM4_2 0x40 //P:P2.6N:P2.7 //
#define ENO3P 0x10
#define ENO4P 0x40
void Pwm_Init_3P(p3_duty) //PWMA的初始化
{
P_SW2 |= 0x80;
PWMA_CCER1 = 0X00;
PWMA_CCMR1 = 0X60; //pwm模式1 配置置位输出
PWMA_CCER1 = 0x01; //配置通道输出使能和极性
PWMA_CCR1 = p3_duty; //设置占空比时间
PWMA_ARR = 500; //设置周期时间
//3.输入输出的引脚配置
PWMA_ENO |= ENO3P; //使能PWM3p通道输出
PWMA_PS |= PWM3_2;
PWMA_BKR = 0X80; //使能主输出
PWMA_CR1 |= 0X01; //启动计数器
}
void Pwm_Init_4P(p4_duty) //PWMA的初始化
{
P_SW2 |= 0x80;
PWMA_CCER1 = 0X00;
PWMA_CCMR1 = 0X60; //pwm模式1 配置置位输出
PWMA_CCER1 = 0x01; //配置通道输出使能和极性
PWMA_CCR1 = p4_duty; //设置占空比时间
PWMA_ARR = 500; //设置周期时间
//3.输入输出的引脚配置
PWMA_ENO |= ENO4P; //使能PWM3p通道输出
PWMA_PS|= PWM4_2;
PWMA_BKR = 0X80; //使能主输出
PWMA_CR1 |= 0X01; //启动计数器
}
经测试2.42.6无波形输出,以上设置是否有误,请大家多多指正
有个问题,,你要控制PWM3 和PWM4为什么你配置的是PWM1的寄存器? 是的哦,复制之前的例程没改{:tongue:} 丑大了
lier378912453 发表于 2024-7-4 11:06
是的哦,复制之前的例程没改 丑大了
别的不知道对不对哦,,CCR CCMR肯定是不对 剩下你再看看 pwm3 与 pwm4配置模式一样,pwm4输出正常,pwm3输出异常 ,代码修正入下
#include "moto_pwm.h"
#include "STC8H_PWM.h"
u16 p3_duty = 500;
u16 p4_duty = 500;
u16 Period= 1023;
/***************PWM始化函数 *****************/
#define PWM3_2 0x10 //P:P2.4N:P2.5 //
#define PWM4_2 0x40 //P:P2.6N:P2.7 //
#define ENO3P 0x10
#define ENO4P 0x40
void Pwm_Init_3P(p3_duty) //PWMA的初始化
{
P_SW2 |= 0x80;
PWMA_CCER2 = 0X00;
PWMA_CCMR3 = 0X60; //pwm模式1 配置置位输出
PWMA_CCER2 = 0x55; //配置通道输出使能和极性
PWMA_ARR = Period; //设置周期时间
PWMA_CCR3 = p3_duty; //设置占空比时间
PWMA_ENO = 0;//关闭通道
PWMA_ENO |= ENO3P; //使能PWM3p通道输出
PWMA_PS|= PWM3_2;
PWMA_BKR = 0X80; //使能主输出
PWMA_CR1 |= 0X01; //启动计数器
}
void Pwm_Init_4P(p4_duty) //PWMA的初始化
{
P_SW2 |= 0x80;
PWMA_CCER2 = 0X00;
PWMA_CCMR4 = 0X60; //pwm模式1 配置置位输出
PWMA_CCER2 = 0x55; //配置通道输出使能和极性
PWMA_ARR = Period; //设置周期时间
PWMA_CCR4 = p4_duty; //设置占空比时间
PWMA_ENO = 0;//关闭通道
PWMA_ENO |= ENO4P; //使能PWM3p通道输出
PWMA_PS|= PWM4_2;
PWMA_BKR = 0X80; //使能主输出
PWMA_CR1|= 0X01; //启动计数器
}
lier378912453 发表于 2024-7-4 16:43
pwm3 与 pwm4配置模式一样,pwm4输出正常,pwm3输出异常 ,代码修正入下
#include "moto_pwm.h"
#include ...
PWM3,PWM4两个初始化函数里面都写了:
PWMA_ENO = 0;//关闭通道
如果你先调用PWM3初始化函数,再调用PWM4初始化函数,先设置的PWMA_ENO就会被清掉,最终只开启了PWM4P通道。 根据大神的提示 输出正常了,
我这里还存在一个问题:P26设置为PWMA 功能 可以输出正常的波形及占空比,但是确不能完全关断使其输出为0,设置如下
u16 p4_duty = 256;
u16 Period= 256;
#define ENO4P 0x40
正常输出设置:
void Pwm_Init_4P(p4_duty) //PWMA的初始化
{
P_SW2 |= 0x80;
PWMA_CCER2 = 0X00;
PWMA_CCMR4 = 0X60; //pwm模式1 配置置位输出
PWMA_CCER2 = 0x55; //配置通道输出使能和极性
PWMA_ARR = Period; //设置周期时间
PWMA_CCR4 = p4_duty; //设置占空比时间
PWMA_ENO = 0;//关闭通道
PWMA_ENO |= ENO4P; //使能PWM3p通道输出
PWMA_PS|= PWM4_2;
PWMA_BKR = 0X80; //使能主输出
PWMA_CR1|= 0X01; //启动计数器
P_SW2 &= 0x7f;
}
void Pwm_Init_4P_close() //PWM4P输出为0
{
PWMA_ENO &= ~ENO4P;
// PWMA_ENO = 0;
P26 = 0;
delay_ms(5);
}
正常输出波形如图为何不是100% 附图1
异常输出波形(想着PWM输出为0):附图2
lier378912453 发表于 2024-7-8 16:59
根据大神的提示 输出正常了,
我这里还存在一个问题:P26设置为PWMA 功能 可以输出正常的波形及占空比,但 ...
高级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
页:
[1]