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