找回密码
 立即注册
楼主: MWX

如何实现软启动?

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:44
  • 最近打卡:2026-04-09 07:24:19
已绑定手机

4

主题

43

回帖

156

积分

注册会员

积分
156
发表于 2025-12-21 17:30:05 | 显示全部楼层
要学习的真多,还有软启动
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:192
  • 最近打卡:2026-07-05 09:36:45

24

主题

76

回帖

109

积分

注册会员

积分
109
发表于 2026-5-14 07:08:18 | 显示全部楼层
梁*** 发表于 2023-6-2 23:28
PWM是一个通用外设,需要复杂控制时,就要用到好多寄存器,你只是从你的简单应用出发提的要求,而厂家设计 ...

梁工:找出老贴请教一下。PWM功能上基本家现,有这么个问题是一上电有个冲击点,引起变压器发出一个格达声音(与开关电源其它无关,只是换掉TL494,其它不变),这个格达一声,这一现象同样在扫频或称慢呼吸时也会有,目前重点是上电平稳过渡就才可以。一上电PWM引脚不能有一点电压产生,软启动呼吸波功能程序是对的。问题发生在一上电软启动程序前,普通示波器很难捕获到。

点评

上电时IO是高阻,不会输出电流,用一个10K的下拉电阻就能保证为低电平。 不同的电路会有不同的效果,不知道你做的是什么,没有具体电路没法评估。  详情 回复 发表于 2026-5-14 09:59
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:394
  • 最近打卡:2026-07-05 12:28:34

83

主题

7893

回帖

1万

积分

超级版主

积分
16839
发表于 2026-5-14 09:59:35 | 显示全部楼层
MW*** 发表于 2026-5-14 07:08
梁工:找出老贴请教一下。PWM功能上基本家现,有这么个问题是一上电有个冲击点,引起变压器发出一个格达 ...

上电时IO是高阻,不会输出电流,用一个10K的下拉电阻就能保证为低电平。
不同的电路会有不同的效果,不知道你做的是什么,没有具体电路没法评估。
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:192
  • 最近打卡:2026-07-05 09:36:45

24

主题

76

回帖

109

积分

注册会员

积分
109
发表于 2026-5-14 11:52:04 | 显示全部楼层
我是在原来TL494半桥电源上换用STC芯片替换掉494,下拉电阻也有,开漏洞/高阻都用了,上电还是格达一声。我把程序发给你看看。

#define MAIN_Fosc        24000000L
#include "STC32G.h"

#define FIX_DEAD        8

sbit FREQ_20K  = P3^4;
sbit FREQ_25K  = P3^5;
sbit FREQ_36K  = P3^6;
sbit FREQ_40K  = P3^7;
sbit ESTOP    = P3^3;

unsigned int Get_SetFreq(void)
{
    if(FREQ_20K == 0)  return 19000;
    if(FREQ_25K == 0)  return 24000;
    if(FREQ_36K == 0)  return 35000;
    if(FREQ_40K == 0)  return 39000;
    return 27000;
}

void Delay1200ms(void)
{
    unsigned int i, j, k;
    for(i=2; i>0; i--)
        for(j=200; j>0; j--)
            for(k=110; k>0; k--);
}

void DelayFastStart(void)
{
    unsigned int i, j, k;
    for(i=2; i>0; i--)
        for(j=200; j>0; j--)
            for(k=50; k>0; k--);
}

void Delay_Wait_10S(void)
{
    unsigned char a;
    for(a=0; a<10; a++)
        Delay1200ms();
}

// PWM初始化 只执行一次
void PWM_InitOnce(unsigned int freq)
{
    unsigned int arr;
    P_SW2 |= 0x80;

    PWMA_ENO = 0x00;
    PWMA_CR1 = 0x00;
    PWMA_CCMR1 = 0x68;
    PWMA_CCER1 = 0x05;
    PWMA_DTR   = FIX_DEAD;
    PWMA_PS    = 0;
    PWMA_BKR   = 0x80;

    arr = MAIN_Fosc / freq - 1;
    PWMA_ARRH = arr >> 8;
    PWMA_ARRL = arr & 0xFF;

    // 先设0占空比
    PWMA_CCR1H = 0;
    PWMA_CCR1L = 0;
    PWMA_CCR2H = 0;
    PWMA_CCR2L = 0;

    PWMA_EGR = 1;
    PWMA_CR1 |= 1;
    PWMA_ENO = 0x03;

    P_SW2 &= ~0x80;
}

// 只改占空比,不动周期、不重启PWM
void SetOnlyDuty(unsigned char duty)
{
    unsigned int arr, ccr;
    if(duty > 50) duty = 50;

    P_SW2 |= 0x80;
    arr = (PWMA_ARRH << 8) | PWMA_ARRL;
    ccr = (unsigned long)arr * duty / 100;

    PWMA_CCR1H = ccr >> 8;
    PWMA_CCR1L = ccr & 0xFF;
    PWMA_CCR2H = ccr >> 8;
    PWMA_CCR2L = ccr & 0xFF;
    P_SW2 &= ~0x80;
}

void main(void)
{
    unsigned int base_freq;
    unsigned char d;
      
      P0M0 |= 0x03;
            P0M1 &= ~0x03;

    P3M0 = 0x00;
    P3M1 = 0x00;
    P_SW2 |= 0x80;      // 使能扩展寄存器访问

    Delay_Wait_10S();

    base_freq = Get_SetFreq();

    PWM_InitOnce(base_freq);
       
    // 慢启动
    for(d=0; d<=50; d++)
    {
        SetOnlyDuty(d);
        DelayFastStart();   
    }

       while(1)
    {
        SetOnlyDuty(50);

        // 高电平急停
        if(ESTOP == 1)
        {
            P_SW2 |= 0x80;
            PWMA_ENO = 0x00;
            PWMA_CR1 = 0x00;
            P_SW2 &= ~0x80;
            P1 = 0x00;
            while(1);
        }
    }
}
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-6 03:24 , Processed in 0.067846 second(s), 61 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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