DGWJL2024 发表于 2025-4-12 10:34:29

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();
                }
        }
}


国芯人工智能 发表于 2025-4-12 10:38:00

在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管脚固定输出高电平,从而可靠地关断可控硅。这种配置方式不仅解决了您当前的问题,还提高了系统的稳定性和可靠性。

[本文内容由国芯人工智能辅助生成,仅供参考]

DebugLab 发表于 2025-4-12 11:07:49

可以通过PWM相关寄存器设置为强制输出高或低电平
也可以关闭PWM再直接设置IO状态

梁工 发表于 2025-4-12 15:55:53

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]
查看完整版本: AI8H2K32U的PWM停止时管脚如何固定输出高电平