【STM32设计】数控直流稳压电源的设计与实现(实物+资料+论文)

发布于:2025-04-03 ⋅ 阅读:(15) ⋅ 点赞:(0)

  资料下载:待更新。。。。



1、实现功能


该系统以大于160-240V、50HZ的交流电为输入,通过数控调压电路实现-30-30V的可调输出电压,最大电流可达1A,以满足不同设备的电源需求,调节电压的步进值不大于1A。采用了模块化设计思路,包括数控调压电路、模数转换器、运算放大器转换器、LCD液晶、单片机和电压电流采集等模块。其中,STM32F103单片机作为控制器,通过INA226电压电流检测模块,将电压电流信号采集,再通过STM32单片机的IIC协议从INA226传感器中读取数据,实现电流和电压的实时检测,并利用电位器+运放组成的电路转换器输出模拟信号以控制数控调压电路,实现输出电压的精确调节。此外,OLED液晶显示模块用于显示当前输出电压和电流,,为用户提供直观的操作界面。在功能实现上,本系统支持电位器输出电压的调节,每次调节步进为0.1V,具有较高的调节精度。

可增加的功能:

2、硬件

硬件框图
在这里插入图片描述

实物

3、代码

   STM32代码采用C语言,标准库编写,软件是keil5,关键代码有中文注释,看不懂可以VX问我

#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>	
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "math.h"
#include "bsp_adc.h"
#include "oled.h"
#include "IO_Init.h"
#include "timer.h"
#include "pwm.h"
#include "TLC5615.h"
#define V_setp 4  // 240*960
#define V_max 1023 // 最大24V
#define V_min 0		 //
#define V_in_r1r2 (11.1*3.3)		 //
#define V_out_r1r2 (11.1*3.3)	 //


// ADC1转换的电压值通过MDA方式传到SRAM
extern __IO uint16_t ADC_ConvertedValue[NOFCHANEL];

u32 ADC_out,ADC_in,ADC_curr;//输入、输出、电流采样ADC值
float V_out,V_in,I_out;		//输入、输出、电流采样电压值
int ADC_err=0;							//输入输出电压差值
int ADC_set=0,DAC_out;			//输出电压设置,DAC输出值
u16 time,time2;


void DAC_OUT(u16 temp)
{
	tlc_5615(temp);
}

void TIM3_IRQHandler(void) //10ms一次
{ 	
	static u8 cnt;
	static u32 A1,A2,A3;//输入、输出
	float error=0;
	if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//是更新中断
	{	 
		time ++;
		time2 ++;
		A1  	+= ADC_ConvertedValue[0];
		A2 		+= ADC_ConvertedValue[1];
		A3		+= ADC_ConvertedValue[2];
		if(cnt++ == 9) //100ms一次
		{
			cnt = 0;
			ADC_in = A1 / 10;
			ADC_out = A2 / 10;
			ADC_curr = A3/10;
			A1 = 0;
			A2 = 0;
			A3 = 0;
			V_in  = (float)ADC_in /4096* V_in_r1r2;//输入电压ADC_out*3.3/4096*11;  
			V_out = (float)ADC_out/4096* V_in_r1r2-0.03;//输出电压
			I_out = (float)ADC_curr*1.43;//1.413		5.7*1000*(AD/4096)约为1.4,这里取1.413
			if(V_out<0)V_out=0;
			error = (float)ADC_set/V_setp/10 - V_out; //偏差校准
			if(error>0)
				ADC_err+=1;
			else if(error<0)
				ADC_err-=1;
			else
				ADC_err = ADC_err;
			
			DAC_out = ADC_set + ADC_err;
				//输出限幅
			if(DAC_out<0)    
				DAC_out = 0;
			else if(DAC_out>V_max)
				DAC_out = V_max;
			DAC_OUT(DAC_out);  //电压输出
		}
//		//限流2A
//		if(ADC_curr>248)   	//0.1欧姆的采样电阻,2A电流为0.2V,  0.2V/ 3.3V/4096 =248
//		{
//			DAC_out = 0;
//			ADC_set = 0;  		//设置电压为0V
//			DAC_OUT(DAC_out);  //电压输出
//		}
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIM3更新中断标志
	}	    
}
u8 app_check() //手机APP验证
{
	u8 k=0;
	if(USART1_RX_STA>5)
	{
		delay_ms(10);
		if(strstr((const char *)USART1_RX_BUF,"GPIO0=0")) //k1
		{
			k=1;
		}
		else if(strstr((const char *)USART1_RX_BUF,"GPIO0=1")) //k2
		{
			k= 2;
		}
		else if(strstr((const char *)USART1_RX_BUF,"GPIO0=2")) //k3
		{
			k= 3;
		}
		else if(strstr((const char *)USART1_RX_BUF,"GPIO0=3")) //k4
		{
			k= 4;
		}
		USART1_RX_STA=0;
		memset(USART1_RX_BUF,0,sizeof(USART1_RX_BUF));
		return k;
	}
	return 0;
}
int main(void) //主函数
{	
  u8 key;
	u8 i,str[100],flag=0;
	SystemInit();
	delay_init();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //   2组中断分组
	
	TLC5615_IO_Init();
	DAC_OUT(4*50);  //电压输出
	ADCx_Init();// ADC 初始化
	OLED_Init();
	usart1_Init(115200);				//串口1初始化 WIFI
//	Esp8266_AP_Init();		//ESP8266 WIFI模块初始化
	
	TIM3_Int_Init(999,71); 		 //1Khz  72000 000 /72*1000 = 1000
	Key_Init();
	
  while(1)
	{
//		if(time2>1000)  //1s一次发送到APP
//		{
//			time2=0;
//			flag=!flag;
//			if(flag)
//			{
				UsartPrintf(ESP8266_USART,"%.2fVW%.2fVW%.2fVW ",V_in,V_out,(float)ADC_set/V_setp/10);
//				i=sprintf((char *)str,"%.1fVW%.1fVW%.1fVW ",V_in,V_out,(float)ADC_set/V_setp/10);
//				UsartPrintf(ESP8266_USART,"AT+CIPSEND=0,%d\r\n",i);
//			}
//			else
//			{
//				UsartPrintf(ESP8266_USART,"%s",str);
//			}
//		}
		if(time>200)
		{
			time = 0;
			OLED_printf(0,0,"Vin :%.2fV    ",V_in);
			OLED_printf(0,2,"Vout:%.2fV    ",V_out);
			OLED_printf(0,4,"Vset:%.1fV    ",(float)ADC_set/V_setp/10);
			OLED_printf(0,6,"Iout:%.3fA    ",ADC_curr/1000.0F);
		}
		if(USART3_RX_BUF[0]==0x01)
		{
			if(ADC_set< V_max)    //限制最大输出电压
				ADC_set += V_setp;
			USART3_RX_BUF[0]=0;
		}
		if(USART3_RX_BUF[0]==0x02)
		{
			if(ADC_set> V_min)    //限制最大输出电压
				ADC_set -= V_setp;
			USART3_RX_BUF[0]=0;
		}
		if(USART3_RX_BUF[0]==0x03)
		{
			DAC_out = 0;
			ADC_set = 0;  		//设置电压为6V
			USART3_RX_BUF[0]=0;
		}
		key = Key_long_Scan(); 				//按键读取,2、3按键支持长按安
		if(key == 0)  //
		{
			key = app_check();
		}
		if(key>0)
		{
			ADC_err=0;
		}
		if(key == 1)  //关闭输出
		{
			DAC_out = V_setp*60;
			ADC_set = V_setp*60;  		//设置电压为1/2输出电压V
		}
		if(key == 2) //加
		{
			if(ADC_set< V_max)    //限制最大输出电压
				ADC_set += V_setp;
		}
		if(key == 3) //减				
		{
			if(ADC_set > V_min)		//限制最小输出电压
				ADC_set -= V_setp;
		}
	}
}








4、原理图/PCB

  原理图和PCB都使用立创EDA绘制,对新手较为友好。可以导出为AD格式的文件
在这里插入图片描述
在这里插入图片描述

5、论文

本次设计的课题是数控直流稳压电源的设计,章节安排大致分为以下几个部分。第一章作为课题的绪论部分,提出了此课题的研究背景以及研究意义,对数控直流稳压电源的国内外研究现状,阐述了此次课题的主要研究内容。第二章是系统设计的总体方案部分,分析系统设计过程中相应的功能需求提出总体设计框架。第三章是硬件电路设计,分别介绍了单片机最小系统、可调输出电路、电压检测电路等硬件设计原理及其对应的电路设计。第四章是软件设计,对过主程序等进行论述。第五章是系统测试,对实物的制作与调试,功能测试等展开讨论。 在这里插入图片描述