其他分享
首页 > 其他分享> > 数控直流电源

数控直流电源

作者:互联网

数控直流电源

本次所实现的功能是:将220V交流电转化输出为5到15V的直流电压,而且可以通过单片机(我这里用的是STM32F407),经过按键对输出电压进行递增或递减。默认状态下(即单片机复位之后整个系统,注意是整个系统输出是5V,此时单片机对应的IO口输出的其实是0V,这个一会儿会具体讲到)例如,你想输出6V电压,那么就按一下递增的对应的按键,输出就会由默认的5V上升到6V(此时对应的IO口输出是1V),因为我这里设置的是每按一次递增按键,输出就增加1V。

实测精准稳定,那我就屁话不多说,直接上仿真电路图和代码,时间有限,我就只讲解关键部分,对于基础较好的同学来说已经绰绰有余了。对于某些大佬来说,还可以在我这个基础上做任何你想要的改动,这些都是很nice的。想要完整电路图和代码的同学可直接可加我微信:wpt666aaa 或QQ:2036795517,这个很方便的。

讲之前的吐槽

本人做这个实验前前后后花了将近我三天的宝贵青春,基本上都泡在了实验室(当然,还是要运动一下,中间踢了场足球)。电路仿真和代码都好说,只要你明白原理,半天的时间即可弄好。关键也是最麻烦和最容易出错的地方就是实物的搭建。有的时候气的我只想剁手,本身左手就有点先天性抖动(本人的肾没问题,这个大家就不要去纠结了),可能是早上就喝了一杯绿豆汤,两眼昏花,我把本身要接电源的地方,接到了一个并没有用到的引脚上,烧了,我认了。仿真的时候对应的起比例放大作用的电阻是310K,接实物的时候硬是调试到了340K,这可是孩子一个个往上加的阻值,本身手就有点儿抖,累到吐血,成功的时候差点晕过去,不是兴奋的,而是累的,幸亏回光返照了一会儿,让我有力气走到宿舍睡个觉。

去TMD的人生。。。还是睡觉最舒服。

模块讲解

7805

7805芯片
引脚图和功能,网上一搜一大堆,我这里只强调一下功能,他的目的就是不管你在VI口输入多大的电压(当然,要在他允许的电压范围之内,我此次实验仿真输入的大约是23.77V,接实物调试时接入24V即可),在VO口和GND口的输出压差都会保持5V,记好,是压差。比如,我在GND输入0V,那么VO口就输出5V,在GND输入1V,那么VO口就输出6V,在GND输入10V,那么VO口就输出15V。
显示电压值
C3和R1是用来滤波的,是一个简单又经典的RC滤波器。

变压器及整形

变压器
这里首先强调,注意!注意!注意!220V高电压,不要拿生命开玩笑,不要买质量不好的变压器。变压加一个整形,这个没什么好说的。我的建议是在实物连接时,把这个省去,直接向VIN口输入一个直流电压值(你根据自己的情况设定,这里我之前提到了,我输入的是24V),我实物连接的时候是直接输入的是24V,并没有用这个变压器,关键老师也不太允许。哈哈哈。最后再强调一下,一定要注意安全。万万不可大意,最好直接像我一样接入直流电。

电压放大电路

很简单,有模电基础的一看就懂,没模电基础的,了解一下集成运放(反比例运算),看完之后,电路你也一看就懂。
运放
这上面整个部分的作用就是将从图中R2左端输入电压(也就是我们单片机对应IO口要接并且输出的地方)放大将近3倍多一点儿(你们根据阻值自己可以算,也可以根据需要放大的比例自己去调)。我希望各位不太明白的仁兄好好研究一下这个部分,这个部分是核心。而且这个是不难的。

STM32单片机输出部分

先配两张图。
在这里插入图片描述
在这里插入图片描述
最下面一行显示的就是PA4引脚的输出电压值,每按一次递增按键,单片机输出增加0.322V,而我们想要按一次增加1V,所以设计了刚才提到的放大电路,放大倍数大概3倍多一点儿,因为3X0.322已经接近 1 了,所以放大三倍多一点儿即可。

这里单片机PA4引脚输出电压范围:0~3.222V
单片机输出口每次按键,增加或减少0.322V
这个系统输出口每次按键,增加或减少 1 V
对应系统电压输出范围:0~15V
放大倍数:3倍多一点(我本人自己调试出来的,具体自己计算,这里我就不多说了)

主函数部分

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "dac.h"
#include "key.h"

int main(void)
{ 
	u16 adcx;
	float temp;
 	u8 t=0;	 
	u16 dacval=0;
	u8 key;	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);      //初始化延时函数
	uart_init(115200);		//初始化串口波特率为115200
	LED_Init();					//初始化LED 
 	LCD_Init();					//LCD初始化
	KEY_Init(); 				//按键初始化
	Dac1_Init();		 		//DAC通道1初始化	
	POINT_COLOR=RED; 
	 
	LCD_ShowString(30,130,200,16,16,"WK_UP:+  KEY1:-");	 
	POINT_COLOR=BLUE;//设置字体为蓝色      	 
	LCD_ShowString(30,150,200,16,16,"DAC VAL:");	      
	LCD_ShowString(30,170,200,16,16,"DAC VOL:0.000V");	      

 	
  DAC_SetChannel1Data(DAC_Align_12b_R,dacval);//初始值为0	
	while(1)
	{
		t++;
		key=KEY_Scan(0);			  
		if(key==WKUP_PRES)
		{		 
			if(dacval<4000)dacval+=400;
			DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//设置DAC值
		}else if(key==2)	
		{
			if(dacval>400)dacval-=400;
			else dacval=0;
			DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//设置DAC值
		}	 
		if(t==10||key==KEY1_PRES||key==WKUP_PRES) 	//WKUP/KEY1按下了,或者定时时间到了
		{	  
 			adcx=DAC_GetDataOutputValue(DAC_Channel_1);//读取前面设置DAC的值
			LCD_ShowxNum(94,150,adcx,4,16,0);     	   //显示DAC寄存器值
			temp=(float)adcx*(3.3/4096);			         //得到DAC电压值
			adcx=temp;
 			LCD_ShowxNum(94,170,temp,1,16,0);     	   //显示电压值整数部分
 			temp-=adcx;
			temp*=1000;
			LCD_ShowxNum(110,170,temp,3,16,0X80);   	   //显示电压值的小数部分		
		LED0=!LED0;	   
			t=0;
		}	    
		delay_ms(10);	 
	}	
}

dac.c部分

//设置通道1输出电压
//vol:0~3300,代表0~3.3V
void Dac1_Set_Vol(u16 vol)
{
	double temp=vol;
	temp/=1000;
	temp=temp*4096/3.3;
	DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12位右对齐数据格式设置DAC值
}

以上是主要代码部分,其实代码部分我也只是改了一下步进值(即每按一次按键的电压改变值,我把他调到了0.322V),至于范围的改动我还不算是太明白,当然了,软件上我改动不了太多,那我就从硬件上改,我还会继续研究这个问题,再发一篇文章讨论一下这个问题。各路大佬也可以在评论区多多指导建议。需要完整代码的加我联系方式,电路图也是的,微信:wpt666aaa 或QQ:2036795517,这个很方便的。

晒一下图,有些凌乱

目的有两个,第一,抱怨一下,是真的累。第二,希望能激发一下大家的思路。(各位仁兄就不要吐槽我的面包板电路接的有多丑了,哈哈哈哈哈)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

最后的最后

你只有看懂了,才能拿来用,所以最好不要放过任何一个疑问,说不定这个疑问就是解决问题的关键。

最后的最后,支持还是要支持一下的,请求各路英雄豪杰多多打赏,多多关注,多多点赞,我是只发布高质量文章的李白有点儿黑。

标签:输出,temp,DAC,16,单片机,直流电源,数控,电压
来源: https://blog.csdn.net/qq_50027598/article/details/118069209