找回密码
 立即注册
查看: 52|回复: 3

AI8H2K32U的PWM停止时管脚如何固定输出高电平

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-04-12 10:34:29

13

主题

19

回帖

213

积分

中级会员

积分
213
发表于 2025-4-12 10:34:29 | 显示全部楼层 |阅读模式
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[HeatPowerflag]);
        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();
                }
        }
}


回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 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管脚固定输出高电平。
  1. c
  2. define   HEATCYC          1000
  3. define   HEATDUTY85      850
  4. define   HEATDUTY70      700
  5. define   HEATDUTY55      550
  6. define   HEATDUTY0       0       //始终高电平
  7. define   HEATDUTY100     1000    //始终低电平
  8. //周期1秒  频率1Hz 晶振11.0592MHz=11059200Hz
  9. void Heatpwminit(void)
  10. {
  11.     P2M0 &= 0xFE;    //1111 1110
  12.     P2M1 &= 0xFE;    //P2.0设置准双向口
  13.     PWMBPSCR = 11058;   //预分频 11059200/(11058+1) = 1000.018Hz 周期T大约1ms
  14.     PWMBENO = 0x00;
  15.     PWMBENO |= ENO5P;   //使能PWM5输出
  16.     PWMBCCER1 = 0x00;                        
  17.     PWMBCCMR1 = 0x68;   //PWM1 模式1输出 0110 1000
  18.     PWMBCCER1 = 0x03;   //低电平有效  0000 0011
  19.     PWMBPSCRL = 0x00;   //PWM周期低字节
  20.     PWMBPSCRH = 0x00;   //PWM周期高字节
  21.     PWMBARR = HEATCYC;  //设置PWM周期
  22.     PWMBCCR1 = HEATDUTY0;  //初始设置为高电平
  23.     PWMBCR1 |= 0x01;   //使能PWM计数器
  24. }
  25. void Heatpwmstop(void)
  26. {
  27.     PWMBCR1 &= ~0x01;  //停止PWM计数器
  28.     P2 &= ~0x01;        //强制P2.0输出高电平
  29. }
复制代码

关键点解释
1. PWM初始化:在Heatpwminit函数中,配置PWM模块的预分频器、周期和占空比,并初始化P2.0管脚为准双向口。
2. PWM停止:在Heatpwmstop函数中,首先停止PWM计数器,然后通过直接操作P2寄存器,强制P2.0管脚输出高电平,确保可控硅关断。

总结
通过上述配置和代码修改,可以确保在PWM停止时,P2.0管脚固定输出高电平,从而可靠地关断可控硅。这种配置方式不仅解决了您当前的问题,还提高了系统的稳定性和可靠性。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-4-12 11:07:49 | 显示全部楼层
可以通过PWM相关寄存器设置为强制输出高或低电平
也可以关闭PWM再直接设置IO状态
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 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

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 04:14 , Processed in 0.112369 second(s), 71 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表