当前位置:网站首页>数控直流电源
数控直流电源
2022-08-05 05:15:00 【李白有点儿黑】
数控直流电源
本次所实现的功能是:将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
对应系统电压输出范围:5~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,这个很方便的。
晒一下图,有些凌乱
目的有两个,第一,抱怨一下,是真的累。第二,希望能激发一下大家的思路。(各位仁兄就不要吐槽我的面包板电路接的有多丑了,哈哈哈哈哈)
丑是丑了点儿,不过功能稳定,数值准确,这就够了,我也就睡个好觉了。哈哈哈哈哈。
最后的最后
你只有看懂了,才能拿来用,所以最好不要放过任何一个疑问,说不定这个疑问就是解决问题的关键。
最后的最后,支持还是要支持一下的,请求各路英雄豪杰多多打赏,多多关注,多多点赞,我是只发布高质量文章的李白有点儿黑。
边栏推荐
- Tensorflow踩坑笔记,记录各种报错和解决方法
- 解决:Unknown column ‘id‘ in ‘where clause‘ 问题
- Day1:用原生JS把你的设备变成一台架子鼓!
- It turns out that the MAE proposed by He Yuming is still a kind of data enhancement
- Distributed and Clustered
- 【数据库和SQL学习笔记】9.(T-SQL语言)定义变量、高级查询、流程控制(条件、循环等)
- 《基于机器视觉测量系统的工业在线检测研究》论文笔记
- Flink Oracle CDC写入到HDFS
- 数据库期末考试,选择、判断、填空题汇总
- Spark ML学习相关资料整理
猜你喜欢
Flink accumulator Counter 累加器 和 计数器
CVPR最佳论文得主清华黄高团队提出首篇动态网络综述
BFC详解(Block Formmating Context)
spingboot 容器项目完成CICD部署
【Pytorch学习笔记】10.如何快速创建一个自己的Dataset数据集对象(继承Dataset类并重写对应方法)
el-pagination左右箭头替换成文字上一页和下一页
读论文- pix2pix
ECCV2022 | RU & Google propose zero-shot object detection with CLIP!
【Pytorch学习笔记】8.训练类别不均衡数据时,如何使用WeightedRandomSampler(权重采样器)
原来何恺明提出的MAE还是一种数据增强
随机推荐
【零基础开发NFT智能合约】如何使用工具自动生成NFT智能合约带白名单可Mint无需写代码
【论文阅读-表情捕捉】High-quality Real Time Facial Capture Based on Single Camera
表情捕捉的指标/图像的无参考质量评价
【数据库和SQL学习笔记】4.SELECT查询2:排序(ORDER BY)、聚合函数、分组查询(GROUP BY)
flink on yarn 集群模式启动报错及解决方案汇总
Flink HA安装配置实战
Flutter 3.0升级内容,该如何与小程序结合
【数据库和SQL学习笔记】7.SQL中的插入(INSERT)、删除(DELETE)、更新(UPDATE)
CVPR 2020 - 频谱正则化
大型Web网站高并发架构方案
Thread handler handle IntentServvice handlerThread
MaskDistill-不需要标注数据的语义分割
通过Flink-Sql将Kafka数据写入HDFS
【Pytorch学习笔记】10.如何快速创建一个自己的Dataset数据集对象(继承Dataset类并重写对应方法)
[Go through 4] 09-10_Classic network analysis
el-table,el-table-column,selection,获取多选选中的数据
Tensorflow踩坑笔记,记录各种报错和解决方法
spark-DataFrame数据插入mysql性能优化
Lecture 3 Gradient Tutorial Gradient Descent and Stochastic Gradient Descent
BFC详解(Block Formmating Context)