中卫市网站建设_网站建设公司_企业官网_seo优化
2026/1/15 13:27:25 网站建设 项目流程

基于stm32的数控线性稳压电源,恒压恒流电源资料。 极具学习和设计参考价值,已验证,资料包括源程序,原理图,pcb等设计资料! 本设计采用220V市电输入工频变压器,将220V交流电压降为24V交流电压,经过全桥整流加电容滤波,输出约32V直流电压.可调输出电压方案采用线性稳压调整器方案,即运放处于比较调整状态,运放输出驱动P型MOS管,电压输出端由电阻分压反馈至运放同相输入端,运放反相输入端由STM32单片机控制TLC5615数模转换器输入模拟电压,根据运放构成比较器原理,运放的同相端和反相端始终趋向于电压相等的特性,不断调整MOS管的导通状态,从而可以实现STM32单片机通过控制数模转换器DA的输出,进而控制直流电压的输出大小.以上为作为电压源输出的方案介绍. ?????作为电流源输出,需要在后级输出采用0.1欧采样电阻来采样电流,采样电流经运放放大后送至单片机AD进行计算,单片机即可获得实际输出电流大小,由此根据设定电流值大小进行比较判断再控制DA输出,即可修正输出电流与设置电流一致.采样经放大的电流一部分又经运放组成比较器电路,采样电流与电位器可设置的比较电压进行比较,当电流大于比较电压,即可改变运放输出的高低电平状态,运放输出接单片机IO口,单片机将此IO设置为外部中断触发模式,目的为实现过流时快速响应并切断输出.调节电位器即可调整过流值大小. ?????液晶显示采用LCD1602,报警方式采用蜂鸣器LED声光报警.关键发热部位的温度通过NTC热敏电阻来采集,具有采集温度范围宽的优点.本机引出STM32单片机的串口接口,便于利用上位机进行控制。 对电路和程序稍加升级,该电源板兼容了稳流输出的功能,最后采用VS制作对应的数据采集上位机,能够更加适应实际的应用。 具体功能: 1、输出电压:范围 0V ~30.0V,输入交流220V,直接插220V市电即可; 2、步进0.1V,纹波 ?30mV; 3、最大输出电流:1.5A; 4、液晶LCD1602显示; 5、由“加、减”两键控制输出电压步进增减; 6、关键器件温度检测,超过60度声光报警。 7、具有输出过流保护,过流值大小通过电位器可调。 8、具有恒流输出和恒压输出两种模式,按键切换。

这个用STM32搞的数控电源有点意思,硬件和程序都整得挺实在。拆开电路板看架构,220V市电进来先过工频变压器降到24V交流,全桥整流配个4700uF大电容,怼出来32V左右的直流电。这里有个坑要注意——工频变压器虽然皮实,但体积重量感人,现在有些DIYer喜欢用开关电源前级替代,不过线性稳压的后级方案倒是稳妥。

核心调压部分玩的是运放+PMOS的经典套路。运放当比较器用,同相端接反馈分压,反相端接DLC5615的DA输出。当DA输出2V时,假设分压比是1:15,那输出电压就是2*(15+1)=32V?别急,实际分压电阻得用精密电阻配,不然DA的LSB步进会漂移。

看段驱动PMOS的关键代码:

void SetVoltage(float targetV){ uint16_t dac_value = (uint16_t)(targetV * 61.44); // 30V对应1843(0x733) TLC5615_Write(dac_value); }

这61.44的系数怎么来的?TLC5615是10位DA,基准2.048V。当DA输出Vdac时,电源输出电压Vout = Vdac(R1+R2)/R2。假设分压电阻是10K+150K,那系数就是(160/10)(2.048/2.0)=16.384。但代码里用61.44明显不对,估计实际分压比是33:1,可能硬件实际用了不同阻值——这提醒我们调压时必须实测分压电阻。

恒流模式更有意思。0.1Ω采样电阻上压降V=0.1*I,用LM358放大20倍后进STM32的ADC。注意这里运放的偏置电压会直接影响测量精度,代码里得做软件校准:

#define CURRENT_OFFSET 82 // 零点偏移量 uint16_t ReadCurrentADC(void){ uint32_t sum = 0; for(uint8_t i=0;i<16;i++){ sum += ADC_Read(ADC_CH_CURRENT); } return (sum >>4) - CURRENT_OFFSET; }

采样16次取平均能有效抑制工频干扰,但CURRENT_OFFSET这个偏移量需要上电时自动校准,而不是写死。更好的做法是开机时短接输出端,自动记录零点AD值。

基于stm32的数控线性稳压电源,恒压恒流电源资料。 极具学习和设计参考价值,已验证,资料包括源程序,原理图,pcb等设计资料! 本设计采用220V市电输入工频变压器,将220V交流电压降为24V交流电压,经过全桥整流加电容滤波,输出约32V直流电压.可调输出电压方案采用线性稳压调整器方案,即运放处于比较调整状态,运放输出驱动P型MOS管,电压输出端由电阻分压反馈至运放同相输入端,运放反相输入端由STM32单片机控制TLC5615数模转换器输入模拟电压,根据运放构成比较器原理,运放的同相端和反相端始终趋向于电压相等的特性,不断调整MOS管的导通状态,从而可以实现STM32单片机通过控制数模转换器DA的输出,进而控制直流电压的输出大小.以上为作为电压源输出的方案介绍. ?????作为电流源输出,需要在后级输出采用0.1欧采样电阻来采样电流,采样电流经运放放大后送至单片机AD进行计算,单片机即可获得实际输出电流大小,由此根据设定电流值大小进行比较判断再控制DA输出,即可修正输出电流与设置电流一致.采样经放大的电流一部分又经运放组成比较器电路,采样电流与电位器可设置的比较电压进行比较,当电流大于比较电压,即可改变运放输出的高低电平状态,运放输出接单片机IO口,单片机将此IO设置为外部中断触发模式,目的为实现过流时快速响应并切断输出.调节电位器即可调整过流值大小. ?????液晶显示采用LCD1602,报警方式采用蜂鸣器LED声光报警.关键发热部位的温度通过NTC热敏电阻来采集,具有采集温度范围宽的优点.本机引出STM32单片机的串口接口,便于利用上位机进行控制。 对电路和程序稍加升级,该电源板兼容了稳流输出的功能,最后采用VS制作对应的数据采集上位机,能够更加适应实际的应用。 具体功能: 1、输出电压:范围 0V ~30.0V,输入交流220V,直接插220V市电即可; 2、步进0.1V,纹波 ?30mV; 3、最大输出电流:1.5A; 4、液晶LCD1602显示; 5、由“加、减”两键控制输出电压步进增减; 6、关键器件温度检测,超过60度声光报警。 7、具有输出过流保护,过流值大小通过电位器可调。 8、具有恒流输出和恒压输出两种模式,按键切换。

过流保护用硬件比较器实现很聪明。当电流采样电压超过电位器设定值时,比较器翻转触发外部中断。代码里中断服务程序直接掐断输出:

void EXTI9_5_IRQHandler(void){ if(EXTI_GetITStatus(EXTI_Line8)){ MOSFET_OFF(); BEEP_ALARM(3); EXTI_ClearITPendingBit(EXTI_Line8); } }

注意这里没做软件消抖,万一比较器临界振荡可能误触发。硬件上加个100pF电容到地会更稳妥。

温度检测用NTC时,代码里的温度计算公式要注意:

float TempCalc(uint16_t adc_val){ float Rt = 10000.0 * (4095.0/adc_val -1); // 10K NTC float T = 1/(1/298.15 + log(Rt/10000)/3950.0); return T -273.15; }

这个公式基于B=3950的NTC,实际器件参数可能有偏差。更专业的做法应该做两点校准,在25度和50度时记录AD值做线性修正。

主控逻辑的状态机切换是亮点:

typedef enum {CV_MODE, CC_MODE} WorkMode; WorkMode currentMode = CV_MODE; void ModeSwitch(void){ static uint8_t lastKey = 0; if(KEY_MODE_TRIGGERED()){ currentMode = (currentMode == CV_MODE)? CC_MODE : CV_MODE; LCD_ShowMode(currentMode); } }

模式切换时要处理DAC输出的平滑过渡,突然切变可能导致输出冲击电流。可以加个渐变过渡:

void ModeTransition(){ float target = (currentMode == CV_MODE) ? setVoltage : setCurrent*loadResistance; for(float v=currentOutput; v!=target; v+=step){ SetVoltage(v); Delay(10); } }

当然实际要考虑环路稳定性,别整成慢动作。

这套方案最妙的其实是上位机交互部分。用VS做的监控程序通过串口发指令,协议设计要讲究帧结构:

// 通信协议帧格式: // 0xAA | CMD | DataH | DataL | Checksum void SendVoltageSetting(float voltage){ uint16_t data = voltage *10; // 0.1V分辨率 UART_SendByte(0xAA); UART_SendByte(CMD_SET_VOL); UART_SendByte(data >>8); UART_SendByte(data &0xFF); UART_SendByte(CheckSum()); }

校验和用异或还是CRC?实际测试发现用累加和就能满足要求,毕竟不是高速通信。

最后说个硬件上的隐患——PMOS管在低压差时功耗惊人。比如输出5V/1A时,管压降27V,功耗27W!必须加大散热片,或者改进电路做成多级调整。不过作为学习项目,能跑起来已经够本,真做产品还得换Buck拓扑。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询