hww22 发表于 2025-6-6 16:34:14

AI8h1k28用PWM 输出 到电感,做1个充电器,代码怎么写

做个镍氢,或3.6铁锂充电器。

打开P02(G2) 输出PWM, P10 (B)读取电池 电压的一般, P13( BI ) 读取电流 在0.1A ~0.2A 对应BI =0.1v~0.2v , 应该怎么做??   

国芯人工智能 发表于 2025-6-6 16:38:00

为了制作一个简单的镍氢电池充电器或36铁锂电池充电器,可以按照以下步骤进行设计。以下代码适用于使用STM32微控制器(如STM32F103、STM32F105)来实现PWM输出和电池读取功能。

代码设计思路
1. 定时器配置:使用STM32的定时器来控制PWM输出,如使用PR0或PR1作为PWM驱动模块。
2. 电池读取模块:使用DAC模块(如P10-TR0或TR1)来读取电池的电压和电流数据。
3. 电源管理:使用DC-DC转换器来确保电池电压稳定,避免过电压或过电流问题。
4. 主程序:设置定时器以执行读取和输出操作,确保定时周期和频率符合要求。

代码示例

1. 基本电路设计
以下代码适用于使用STM32F103或F105微控制器来实现镍氢或36铁锂电池充电器。代码中假设使用P02-PR0和P10-TR0作为驱动和读取模块。

c
// 电源管理模块
void init电源() {
    PORTD = 0; // 高电平
    PORTA = 1; // 较高电平
    PORTB = 0; // 较低电平
    PORTC = 0; // 低电平
    // 可选:使用PWM控制模块
}

// 输出模块
void output PWM() {
    while(1) {
      ifPORTA(1) { // 高电平
            TR0 = 0; // 不读取
            P02-PR0 = 0x00; // 低电平
            P02-PR1 = 0x00; // 高电平
      } else ifPORTB(1) { // 低电平
            TR0 = 1; // 读取
            P02-PR0 = 0x80; // 高电平
            P02-PR1 = 0x00; // 低电平
      }
    }
}

// 读取模块
void read voltage() {
    while(1) {
      PORTA = 1; // 高电平
      PORTB = 0; // 较低电平
      PORTC = 0; // 低电平
      if PORTA(1) { // 高电平
            P10-TR0 = 0x00; // 不读取
      } else if PORTB(1) { // 低电平
            P10-TR0 = 0x80; // 读取
            break;
      }
    }
}

// 主程序
void main() {
    while(1) {
      // 读取电压数据
      read voltage();
      
      // 输出PWM信号
      output PWM();
      
      // 可选:根据电压范围调整定时器输出
      // 例如,电压01V~02V对应BI=01v~02v
      // 可根据具体需求调整定时周期和频率
    }
}

注意事项
1. 定时器配置:根据STM32F103或F105的定时器类型(如PR0、PR1)调整输出信号。
2. 电压范围:根据镍氢或36铁锂电池的电压范围进行调整。例如,镍氢电池电压通常在3.7V~4.2V,36FeLi电池电压通常在2.4V~2.9V。
3. 电源管理:使用DC-DC转换器确保电池电压稳定,避免过电压问题。
4. 调试:可以通过使用示波器查看电压和电流数据,确保读取和输出模块正常工作。

示例代码
以下代码为一个简单的示例,适用于使用STM32F103或F105微控制器来制作镍氢或36铁锂电池充电器。

c
// 路灯电路
P02-PR0 = 0x00; // 低电平
P02-PR1 = 0x00; // 高电平
P10-TR0 = 0x00; // 低电平
P10-TR1 = 0x00; // 高电平

// 输出模块
output PWM();

// 读取模块
read voltage();

// 可选:根据电压范围调整定时器输出
while(1) {
    if(PORTA(1)) {
      P02-PR0 = 0x80; // 高电平
      P02-PR1 = 0x00; // 低电平
    } else if(PORTB(1)) {
      P02-PR0 = 0x00; // 低电平
      P02-PR1 = 0x80; // 高电平
    }
}

总结
以上代码为一个简单的示例,可以进一步根据具体需求调整定时器频率、电压范围和输出信号。确保电路设计符合镍氢或36铁锂电池的规格和应用要求。

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

ercircle 发表于 2025-6-6 16:41:33

只是GPIO和ADC操作?参考实验箱例程:
https://www.stcaimcu.com/data/download/DemoCode/STC8H8K64U-DEMO-CODE-V9.6.zip

梁工 发表于 2025-6-6 17:41:39

测电压要对地接一个0.1uF电容,采样电流后要经过RC(3K+0.1uF)再到ADC。
使用PID控制PWM,根据给定的电流值和电压值,计算误差和积分,控制PWM。
电流优先,一旦到达设定的电流值,就要通过PID计算减小PWM,达到恒流目的,此为恒流充电阶段。
电流小于设定值,就用电压来计算PID,控制PWM从而稳压在设定的电压值,此为恒压充电阶段。
电流小于一定值(比如设定恒流值的1/10),则充电结束。

hww22 发表于 2025-6-7 08:54:08

打开P02的 PWM7_3 频率50KHZ 要怎么写, 看不明白 说明书, 写的太复杂。

梁工 发表于 2025-6-7 15:08:40

hww22 发表于 2025-6-7 08:54
打开P02的 PWM7_3 频率50KHZ 要怎么写, 看不明白 说明书, 写的太复杂。

STC8H系列-高级PWM范例程序下载,2024/1/3 更新
https://www.stcaimcu.com/thread-1779-1-1.html
(出处: 国芯技术交流网站)
页: [1]
查看完整版本: AI8h1k28用PWM 输出 到电感,做1个充电器,代码怎么写