数控直流电源
作者:互联网
数控直流电源
本次所实现的功能是:将220V交流电转化输出为5到15V的直流电压,而且可以通过单片机(我这里用的是STM32F407),经过按键对输出电压进行递增或递减。默认状态下(即单片机复位之后整个系统,注意是整个系统输出是5V,此时单片机对应的IO口输出的其实是0V,这个一会儿会具体讲到)例如,你想输出6V电压,那么就按一下递增的对应的按键,输出就会由默认的5V上升到6V(此时对应的IO口输出是1V),因为我这里设置的是每按一次递增按键,输出就增加1V。
实测精准稳定,那我就屁话不多说,直接上仿真电路图和代码,时间有限,我就只讲解关键部分,对于基础较好的同学来说已经绰绰有余了。对于某些大佬来说,还可以在我这个基础上做任何你想要的改动,这些都是很nice的。想要完整电路图和代码的同学可直接可加我微信:wpt666aaa 或QQ:2036795517,这个很方便的。
讲之前的吐槽
本人做这个实验前前后后花了将近我三天的宝贵青春,基本上都泡在了实验室(当然,还是要运动一下,中间踢了场足球)。电路仿真和代码都好说,只要你明白原理,半天的时间即可弄好。关键也是最麻烦和最容易出错的地方就是实物的搭建。有的时候气的我只想剁手,本身左手就有点先天性抖动(本人的肾没问题,这个大家就不要去纠结了),可能是早上就喝了一杯绿豆汤,两眼昏花,我把本身要接电源的地方,接到了一个并没有用到的引脚上,烧了,我认了。仿真的时候对应的起比例放大作用的电阻是310K,接实物的时候硬是调试到了340K,这可是孩子一个个往上加的阻值,本身手就有点儿抖,累到吐血,成功的时候差点晕过去,不是兴奋的,而是累的,幸亏回光返照了一会儿,让我有力气走到宿舍睡个觉。
去TMD的人生。。。还是睡觉最舒服。
模块讲解
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