AI8H2K32U的PWM停止时管脚如何固定输出高电平
AI8H2K32U用P2.0脚控制加热管给水加热,要设置4个加热功率,所以用PWM方式控制可控硅调整功率(可控硅电路低电平有效,高电平关断)。现在遇到问题是停止加热后(pwm停止),管脚有时输出高电平,有时输出低电平。不能固定输出高电平关断。#define HEAT_CYC 1000
#define HEAT_DUTY_85 850
#define HEAT_DUTY_70 700
#define HEAT_DUTY_55 550
#define HEAT_DUTY_0 0 //始终高电平
#define HEAT_DUTY_100 1000 //始终低电平
//周期1秒频率1Hz 晶振11.0592MHz=11059200Hz
void Heat_pwm_init(void)
{
P2M0 &= 0xFE; //1111 1110
P2M1 &= 0xFE; //P2.0设置准双向口
PWMB_PSCR = 11058; //预分频 11059200/(11058+1) = 1000.018Hz 周期T大约1ms
PWMB_ENO = 0x00;
PWMB_ENO |= ENO5P; //使能PWM5输出
PWMB_CCER1 = 0x00;
PWMB_CCMR1 = 0x68; //PWM1 模式1输出 0110 1000
PWMB_CCER1 = 0x03; //低电平有效0000 0011
PWMB_PS = 0x00;
PWMB_PS |= PWM5_1; //PWM5在P2.0
PWMB_ARR = HEAT_CYC; //1000ms = 1s
// PWMB_CCR5 = HEAT_DUTY_0;
PWMB_CCR1 = HEAT_DUTY_0; //高电平 加热关
PWMB_BKR = 0x80;
// PWMB_CR1 |= 0x01;
}
void Set_heat_pwm_duty(u16 duty)
{
PWMB_ARR = HEAT_CYC; //1000ms = 1s
PWMB_CCR1 = duty;
}
void HeatStop(void)
{
Set_heat_pwm_duty(HEAT_DUTY_0);
// Delay200us();
PWMB_CR1 &= (~0x01); //停止加热
}
void HeatStart(void) //
{
Set_heat_pwm_duty(HeatPower);
PWMB_CR1 |= 0x01; //开PWM 加热开始
}
void PreheatDown(void)//预热到计时
{
Second++;
if(Second>59)
{
Second = 0;
Minute++;
if(Minute>(Proheat->SetTime-1))//
{
Timeflag = 0; //定时时间到标志位清0
HeatStop(); //停止加热
Heat.TotalMinute += Minute;
Work.TotalMinute += Minute;
save_work_data();
Minute = 0;
Power_off_beep_startup();
}
}
}
在AI8H2K32U微控制器中,PWM模块的配置和管脚输出状态的控制需要特别注意,尤其是在停止PWM输出时,确保管脚能够固定输出高电平以关断可控硅。以下是针对您的问题的详细分析和解决方案。
问题分析
1. PWM停止时的管脚状态:当PWM停止时,管脚的状态可能取决于PWM模块的配置和寄存器的状态。如果未正确配置,管脚可能会保持最后一次PWM输出的状态,导致有时输出高电平,有时输出低电平。
2. 可控硅控制逻辑:可控硅电路低电平有效,高电平关断。因此,在停止加热时,必须确保P2.0管脚固定输出高电平。
解决方案
1. PWM停止时的管脚状态控制:在停止PWM输出时,可以通过配置PWM模块的寄存器,强制管脚输出高电平。
2. 管脚模式配置:确保P2.0管脚在PWM停止时能够正确输出高电平。
代码实现
以下是修改后的代码,确保在PWM停止时,P2.0管脚固定输出高电平。
c
define HEATCYC 1000
define HEATDUTY85 850
define HEATDUTY70 700
define HEATDUTY55 550
define HEATDUTY0 0 //始终高电平
define HEATDUTY100 1000 //始终低电平
//周期1秒频率1Hz 晶振11.0592MHz=11059200Hz
void Heatpwminit(void)
{
P2M0 &= 0xFE; //1111 1110
P2M1 &= 0xFE; //P2.0设置准双向口
PWMBPSCR = 11058; //预分频 11059200/(11058+1) = 1000.018Hz 周期T大约1ms
PWMBENO = 0x00;
PWMBENO |= ENO5P; //使能PWM5输出
PWMBCCER1 = 0x00;
PWMBCCMR1 = 0x68; //PWM1 模式1输出 0110 1000
PWMBCCER1 = 0x03; //低电平有效0000 0011
PWMBPSCRL = 0x00; //PWM周期低字节
PWMBPSCRH = 0x00; //PWM周期高字节
PWMBARR = HEATCYC;//设置PWM周期
PWMBCCR1 = HEATDUTY0;//初始设置为高电平
PWMBCR1 |= 0x01; //使能PWM计数器
}
void Heatpwmstop(void)
{
PWMBCR1 &= ~0x01;//停止PWM计数器
P2 &= ~0x01; //强制P2.0输出高电平
}
关键点解释
1. PWM初始化:在Heatpwminit函数中,配置PWM模块的预分频器、周期和占空比,并初始化P2.0管脚为准双向口。
2. PWM停止:在Heatpwmstop函数中,首先停止PWM计数器,然后通过直接操作P2寄存器,强制P2.0管脚输出高电平,确保可控硅关断。
总结
通过上述配置和代码修改,可以确保在PWM停止时,P2.0管脚固定输出高电平,从而可靠地关断可控硅。这种配置方式不仅解决了您当前的问题,还提高了系统的稳定性和可靠性。
[本文内容由国芯人工智能辅助生成,仅供参考] 可以通过PWM相关寄存器设置为强制输出高或低电平
也可以关闭PWM再直接设置IO状态 STC8H系列的高级PWM,连续输出0或1有2种方法(以PWM1P为例):
1、使用PWMx_ENO禁止输出PWM,对应IO成为普通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]