找回密码
 立即注册
查看: 212|回复: 10

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2025-06-20 08:29:29

2

主题

10

回帖

172

积分

注册会员

积分
172
发表于 2025-6-6 16:34:14 | 显示全部楼层 |阅读模式
做个镍氢,或3.6铁锂充电器。

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

使用道具 举报 送花

3

主题

534

回帖

-221

积分

等待验证会员

积分
-221
发表于 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作为驱动和读取模块。
  1. c
  2. // 电源管理模块
  3. void init电源() {
  4.     PORTD = 0; // 高电平
  5.     PORTA = 1; // 较高电平
  6.     PORTB = 0; // 较低电平
  7.     PORTC = 0; // 低电平
  8.     // 可选:使用PWM控制模块
  9. }
  10. // 输出模块
  11. void output PWM() {
  12.     while(1) {
  13.         ifPORTA(1) { // 高电平
  14.             TR0 = 0; // 不读取
  15.             P02-PR0 = 0x00; // 低电平
  16.             P02-PR1 = 0x00; // 高电平
  17.         } else ifPORTB(1) { // 低电平
  18.             TR0 = 1; // 读取
  19.             P02-PR0 = 0x80; // 高电平
  20.             P02-PR1 = 0x00; // 低电平
  21.         }
  22.     }
  23. }
  24. // 读取模块
  25. void read voltage() {
  26.     while(1) {
  27.         PORTA = 1; // 高电平
  28.         PORTB = 0; // 较低电平
  29.         PORTC = 0; // 低电平
  30.         if PORTA(1) { // 高电平
  31.             P10-TR0 = 0x00; // 不读取
  32.         } else if PORTB(1) { // 低电平
  33.             P10-TR0 = 0x80; // 读取
  34.             break;
  35.         }
  36.     }
  37. }
  38. // 主程序
  39. void main() {
  40.     while(1) {
  41.         // 读取电压数据
  42.         read voltage();
  43.         
  44.         // 输出PWM信号
  45.         output PWM();
  46.         
  47.         // 可选:根据电压范围调整定时器输出
  48.         // 例如,电压01V~02V对应BI=01v~02v
  49.         // 可根据具体需求调整定时周期和频率
  50.     }
  51. }
复制代码

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

示例代码
以下代码为一个简单的示例,适用于使用STM32F103或F105微控制器来制作镍氢或36铁锂电池充电器。
  1. c
  2. // 路灯电路
  3. P02-PR0 = 0x00; // 低电平
  4. P02-PR1 = 0x00; // 高电平
  5. P10-TR0 = 0x00; // 低电平
  6. P10-TR1 = 0x00; // 高电平
  7. // 输出模块
  8. output PWM();
  9. // 读取模块
  10. read voltage();
  11. // 可选:根据电压范围调整定时器输出
  12. while(1) {
  13.     if(PORTA(1)) {
  14.         P02-PR0 = 0x80; // 高电平
  15.         P02-PR1 = 0x00; // 低电平
  16.     } else if(PORTB(1)) {
  17.         P02-PR0 = 0x00; // 低电平
  18.         P02-PR1 = 0x80; // 高电平
  19.     }
  20. }
复制代码

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-06-28 13:49:44
已绑定手机

72

主题

2016

回帖

4540

积分

荣誉版主

无情的代码机器

积分
4540
发表于 2025-6-6 16:41:33 | 显示全部楼层
只是GPIO和ADC操作?参考实验箱例程:
https://www.stcaimcu.com/data/do ... -DEMO-CODE-V9.6.zip
截图202506061640097439.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2025-06-28 00:08:16

75

主题

6163

回帖

1万

积分

超级版主

积分
12930
发表于 2025-6-6 17:41:39 | 显示全部楼层
测电压要对地接一个0.1uF电容,采样电流后要经过RC(3K+0.1uF)再到ADC。
使用PID控制PWM,根据给定的电流值和电压值,计算误差和积分,控制PWM。
电流优先,一旦到达设定的电流值,就要通过PID计算减小PWM,达到恒流目的,此为恒流充电阶段。
电流小于设定值,就用电压来计算PID,控制PWM从而稳压在设定的电压值,此为恒压充电阶段。
电流小于一定值(比如设定恒流值的1/10),则充电结束。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2025-06-20 08:29:29

2

主题

10

回帖

172

积分

注册会员

积分
172
发表于 2025-6-7 08:54:08 | 显示全部楼层
打开P02的 PWM7_3 频率50KHZ 要怎么写, 看不明白 说明书, 写的太复杂。

点评

STC8H系列-高级PWM范例程序下载,2024/1/3 更新 https://www.stcaimcu.com/thread-1779-1-1.html (出处: 国芯技术交流网站)  详情 回复 发表于 2025-6-7 15:08
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2025-06-28 00:08:16

75

主题

6163

回帖

1万

积分

超级版主

积分
12930
发表于 2025-6-7 15:08:40 | 显示全部楼层
hww*** 发表于 2025-6-7 08:54
打开P02的 PWM7_3 频率50KHZ 要怎么写, 看不明白 说明书, 写的太复杂。

STC8H系列-高级PWM范例程序下载,2024/1/3 更新
https://www.stcaimcu.com/thread-1779-1-1.html
(出处: 国芯技术交流网站)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2025-06-20 08:29:29

2

主题

10

回帖

172

积分

注册会员

积分
172
发表于 2025-6-17 14:27:09 | 显示全部楼层
刚测,正常输出可调PWM,ARR和CCR采用预装载方式,在使用中可随时改变,寄存器初始化可参照设置。采用的STC8H1K28,  P2.7脚输出(PWM4N)
        P_SW2 |= 0x80;                                //开启P_SW2寄存器1000 0000
        PWMA_CCER2 = 0x00;                 //写CCMRx前必须先清零CCERx关闭通道
        PWMA_CCMR4 = 0x68;                 //设置CC4为PWM输出模式,开启预装载CCR4 0110 1000
        //PWMA_CCMR4 = 0x78;             //设置CC4为PWM输出模式,开启预装载CCR4 0111 1000(负极性输出)
        PWMA_CCER2 = 0x40;                 //0100 0000单独使能CC4N通道(不开CC4P),输出高电平
        PWMA_CCR4 = 2500;                  //设置占空比时间
        PWMA_ARR = 5000;                   //设置周期时间
        PWMA_PS = 0x40;                    //PWM4N在P2.7输出0100 0000
        PWMA_ENO = 0x80;                   //使能PWM4N端口输出1000 0000
        PWMA_BKR = 0x80;                   //使能主输出1000 0000
        PWMA_CR1 = 0x81;                   //开始计时 1000 0001开启自动预装载PWMA_ARR

如果改到  打开P02(G2) 输出PWM7_3 ,  要怎么改。

点评

[attachimg]104892[/attachimg]  详情 回复 发表于 2025-6-17 21:39
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2025-06-20 08:29:29

2

主题

10

回帖

172

积分

注册会员

积分
172
发表于 2025-6-17 15:09:36 | 显示全部楼层
#define                PWM7P_OUT_EN()        PWMB_ENO |= 0x10        /* 使能 PWM7P 输出 */
函数名 u8 PWM_Configuration(PWM7, PWMx_InitDefine *PWMx)
typedef struct
{
        CCMRn_PWM_MODE1; //u8        PWM_Mode;                        //模式,   
        5000;//u16        PWM_Period;                //周期时间,   0~65535
        2500;//'u16        PWM_Duty;                        //占空比时间, 0~Period
        0;//u8        PWM_DeadTime;        //死区发生器设置, 0~255
//        u8        PWM_Reload;                                //输出比较的预装载使能,   ENABLE,DISABLE
//        u8        PWM_Fast;                                        //输出比较快速功能使能,   ENABLE,DISABLE
//        u8        PWM_PreLoad;                        //预装载,     ENABLE,DISABLE
//        u8        PWM_BrakeEnable;        //刹车输入使能,  ENABLE,DISABLE
        ENO7P;//u8        PWM_EnoSelect;                //输出通道选择,        ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
        u8        PWM_CEN_Enable;                //使能计数器, ENABLE,DISABLE
ENABLE;//        u8        PWM_MainOutEnable;//主输出使能,  ENABLE,DISABLE
} PWMx_InitDefine;
void UpdatePwm(PWM7, PWMx_Duty *PWMx);
typedef struct
{
        ;//u16        PWM1_Duty;                        //PWM1占空比时间, 0~Period
        ;//u16        PWM2_Duty;                        //PWM2占空比时间, 0~Period
        ;//u16        PWM3_Duty;                        //PWM3占空比时间, 0~Period
        ;//u16        PWM4_Duty;                        //PWM4占空比时间, 0~Period
        ;//u16        PWM5_Duty;                        //PWM5占空比时间, 0~Period
        ;//u16        PWM6_Duty;                        //PWM6占空比时间, 0~Period
        ;//u16        PWM7_Duty;                        //PWM7占空比时间, 0~Period
        ;//u16        PWM8_Duty;                        //PWM8占空比时间, 0~Period
} PWMx_Duty;
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2025-06-28 00:08:16

75

主题

6163

回帖

1万

积分

超级版主

积分
12930
发表于 2025-6-17 21:39:28 | 显示全部楼层
hww*** 发表于 2025-6-17 14:27
刚测,正常输出可调PWM,ARR和CCR采用预装载方式,在使用中可随时改变,寄存器初始化可参照设置。采用的ST ...



截图202506172139207135.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2025-06-20 08:29:29

2

主题

10

回帖

172

积分

注册会员

积分
172
发表于 2025-6-20 08:29:29 | 显示全部楼层
    有个疑问, P02 如果正常输出 PWM信号,  P22=P02; 这个语句,成立? P22也几乎同步输出一样信号?????????????????

点评

P22 = P02; 只在执行这句时P0.2的电平送给P2.2,是否同步看你什么时候执行,如果主循环只有这一句,则最多延时5个时钟,刚好跳转主循环时PWM跳变,跳转3T,P22 = P02操作需要2T。  详情 回复 发表于 2025-6-20 10:10
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-28 23:42 , Processed in 0.144922 second(s), 103 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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