液晶显示模块(基于STM32的数控直流电源)
Posted
篇首语:为寻求真理的努力所付出的代价,总是比不担风险地占有它要高昂得多。本文由小常识网(cha138.com)小编为大家整理,主要介绍了液晶显示模块(基于STM32的数控直流电源)相关的知识,希望对你有一定的参考价值。
液晶显示模块(基于STM32的数控直流电源)
数控直流电源
目录
1、介绍 …………
2、整体方案 …………
3、硬件电路 …………
4、软件 …………
5、心得小结 …………
6、附录: 1、元器件 …………
2、电路图 …………
3、代码 …………
1、介绍:
这个数控直流电源,是基于CORTEX_M3的STM32F103ZET6芯片的一个制作。它的能实现0~9.9V的电压变化,每次变化为0.1V。它采用了内部的12位DAC和12位的ADC,精度比普通的8位ADC高出16倍,在实际的测试中,本制作的精度达到0.01V。本制作可以实现按键加减电压大小、按键自动调节电压、输入数值控制输出电压、输出幅值频率可调的三角波功能。同时,本制作采用320*240的LCD液晶显示,并且在显示的基础上,制作了完整的用户界面,大大方便了用户的使用。
2、整体方案:
方案介绍:
本方案围绕stm32芯片,由供电模块、液晶显示模块、报警模块、负载电流检测模块、电源产生模块、按键模块构成。
电源模块:我采用的是桥式整流结合三端稳压芯片的处理方法。由此得到单片机使用的5v电源和驱动运算放大器的12V电源。
电源发生模块:这个系统由LM358运算放大器和stm32芯片内部12位DAC组成。
负载电流检测模块:这个模块由stm32内部12位ADC和自制的1欧姆康铜电阻组成。
液晶显示模块:主要有320*240LCD组成,负责显示参数和提供用户服务界面。
过流报警模块:这个部分由蜂鸣器和红色的LED指示灯组成。负责当发生过流现象时,给用户报警。
按键模块:这是本系统 的用户控制方式。
3、硬件电路
(1)、stm32f103zet6单片机最小系统:
这款ST公司生产的基于cortex_m3内核的芯片,在当今的电子产品领域占有很大的市场。这块32位芯片,有 144个引脚、512K的rom、2路ADC支持16通道,2路DAC,14个定时器,spi通信、i2c通信、串口通信方式。对于本系统,这个芯片的已经足够。
(2)、电源电路
在这个部分,我主要采用桥式整流,使用了四个耐压1000v的in4007,将双24V的变压器得到的副边电压进行整流,再由1000uf电容和LM7815和LM2940稳压得系统所需的5V和12V电源。
(3)、电源产生电路和检测电路
在运算放大器部分,我选择的是带宽1M的LM358,采用1k的精密电阻,将DA得到的电源放大4倍,再经过一级的放大器 跟随电路输入到负载电路之中。
负载串联了1欧姆的康铜电阻,康铜电阻的温漂小,直接AD测量两端的电压便可得到负载的电流状况。
(4)、显示电路:
采用的是lil9320驱动的320*240方案。
(5)、报警电路和按键电路灯省略。
4、软件部分:
主体程序流程图
在程序设计部分,主要设计ADC和DAC以及定时器中断和外部触发中断的使用。
5、心得小结
在本次设计中,前期我花费了大量的时间查阅论文和思考放大电路设计上,而最后经过试验,还是选择了简单而实用的放大器加更随器的方案。在设计过程中遇到过很麻烦的事,当时网购了DAC7512的12位DAC芯片,发现是很小的贴片,经过较长时间搞定之后,一次使用过程中,这块芯片坏了。于是,不得不转到当前采用的方案上。
这个教训,让我明白实践和试验的重要性,少走弯路,多做实用的事。
6、附录:
1、元器件清单:stm32f103zet6单片机最小系统,320*240tft lcd,24V变压器、按键模块、LM7805、LM7815、LM2940等
2、原理图:
3、源程序:
主函数部分:
int main(void)
。
。
。
while(1) //主循环
DAC->DHR12R1 =0;
ili9320_Chinese_str((320-16*17)/2,50,17,Chinese_Table_16x16_nan,charColor,Blue);
ili9320_Chinese_str(70,90,3,Chinese_Table_16x16_ti,charColor,Blue);
ili9320_Chinese_str(140,90,8,Chinese_Table_16x16_shu,charColor,Blue);
ili9320_Chinese_str((320-16*15)/2,200,15,Chinese_Table_16x16_zun,charColor,Blue);
if(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5))
Delay_ARMJISHU(100);
while(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5));
ili9320_Clear(Blue);
exit_2=1;
while(exit_2) //按*键进入 功能循环
DAC->DHR12R1 = 0;
ili9320_Chinese_str(0,10,6,Chinese_Table_16x16_1,charColor,Blue);
ili9320_Chinese_str(0,40,6,Chinese_Table_16x16_2g,charColor,Blue);
ili9320_Chinese_str(0,70,6,Chinese_Table_16x16_3,charColor,Blue);
ili9320_Chinese_str(0,100,3,Chinese_Table_16x16_4,charColor,Blue);
// ili9320_Chinese_str(0,130,2,Chinese_Table_16x16_5,charColor,Blue);
//功能一:手动加减电压值
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))
Delay_ARMJISHU(200);
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12));
ili9320_Clear(Blue);
exit=1;
while(exit)
ili9320_Chinese_str(110,55,4,Chinese_Table_16x16_d,charColor,Blue);
ili9320_PutStr_16x24(248, 50, c4, 1, charColor, Blue);
a1=(vol+1)%10;
a2=(vol+1-a1)/10;
ili9320_PutChar_num(176,50,a2,charColor,Blue);
ili9320_DrawPoint(200,50,charColor,Blue);//画一个点
ili9320_PutChar_num(224,50,a1,charColor,Blue);
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)) //+
Delay_ARMJISHU(300);
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8))
if(vol<99)
vol=vol+1;
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8));
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9)) //-
Delay_ARMJISHU(300);
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9))
if(vol>3)
vol=vol-1;
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9));
DAC->DHR12R1 = (vol*40950-230)/1304;
//检测过流
ADCConvertedValueLocal = ADCConvertedValue;
Precent = (ADCConvertedValueLocal*100/0x1000); //算出百分比
Voltage = Precent*33;
while(Voltage>500)
ili9320_Clear(Blue);
while(1)
ili9320_Chinese_str(110,55,4,Chinese_Table_16x16_d,charColor,Blue);
DAC->DHR12R1 = 0;
a1=0;
a2=0;
ili9320_PutChar_num(176,50,a2,charColor,Blue);
ili9320_DrawPoint(200,50,charColor,Blue);//画一个点
ili9320_PutChar_num(224,50,a1,charColor,Blue);
ili9320_PutStr_16x24(248, 50, c4, 1, charColor, Blue);
ili9320_Chinese_str((320-16*10)/2,200,10,Chinese_Table_16x16_x,charColor,Blue);
GPIO_SetBits(GPIO_DAC,DS1_PIN|DS2_PIN); //所有引脚置高电平
//退出按键,在所有的功能中都使用这种退出方法
if(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5))
Delay_ARMJISHU(300);
if(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5))
while(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5));
exit=0;
vol=0;
ili9320_Clear(Blue);
//功能2:自动加减电压值 (6号按键)
if(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6))
Delay_ARMJISHU(200);
if(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6))
exit=1;
while(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6));
/*-----------功能2的定时器初始化------------*/
Timer_Config();
NVIC_Config();
TIM_Cmd(TIM2,DISABLE); //起初是关闭的,当进入功能2后打开
ili9320_Clear(Blue);
while(exit)
vol=vol_21;
ili9320_Chinese_str(110,55,4,Chinese_Table_16x16_d,charColor,Blue);
ili9320_PutStr_16x24(248, 50, c4, 1, charColor, Blue);
a1=(vol+1)%10;
a2=(vol+1-a1)/10;
ili9320_PutChar_num(176,50,a2,charColor,Blue);
ili9320_DrawPoint(200,50,charColor,Blue);//画一个点
ili9320_PutChar_num(224,50,a1,charColor,Blue);
//自加扫描
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)&counter21)
flag2=1;
Delay_ARMJISHU(200);
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8))
TIM_Cmd(TIM2,ENABLE);
counter21=0;
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8));
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)&!counter21)
Delay_ARMJISHU(200);
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8))
TIM_Cmd(TIM2,DISABLE);
counter21=1;
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8));
//自减扫描
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9)&counter22)
flag2=0;
Delay_ARMJISHU(200);
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9))
TIM_Cmd(TIM2,ENABLE);
counter22=0;
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9));
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9)&!counter22)
Delay_ARMJISHU(200);
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9))
TIM_Cmd(TIM2,DISABLE);
counter22=1;
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9));
DAC->DHR12R1 = (vol*40950-230)/1304;
//检测过流
ADCConvertedValueLocal = ADCConvertedValue;
Precent = (ADCConvertedValueLocal*100/0x1000); //算出百分比
Voltage = Precent*33;
while(Voltage>500)
ili9320_Clear(Blue);
while(1)
ili9320_Chinese_str(110,55,4,Chinese_Table_16x16_d,charColor,Blue);
DAC->DHR12R1 = 0;
a1=0;
a2=0;
ili9320_PutChar_num(176,50,a2,charColor,Blue);
ili9320_DrawPoint(200,50,charColor,Blue);//画一个点
ili9320_PutChar_num(224,50,a1,charColor,Blue);
ili9320_PutStr_16x24(248, 50, c4, 1, charColor, Blue);
ili9320_Chinese_str((320-16*10)/2,200,10,Chinese_Table_16x16_x,charColor,Blue);
GPIO_SetBits(GPIO_DAC,DS1_PIN|DS2_PIN); //所有引脚置高电平
//退出按键,在所有的功能中都使用这种退出方法
if(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5))
Delay_ARMJISHU(100);
if(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5))
while(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5));
exit=0;
TIM_Cmd(TIM2,DISABLE);
vol=0;
vol_22=0;
ili9320_Clear(Blue);
//功能3:输入电压数值 7号功能键
if(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7))
Delay_ARMJISHU(100);
if(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7))
exit=1;
while(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7));
ili9320_Clear(Blue);
while(exit)
num31=num33;
num32=num34;
ili9320_Chinese_str(10,12,12,Chinese_Table_16x16_q,charColor,Blue);
ili9320_Chinese_str(110,55,4,Chinese_Table_16x16_d,charColor,Blue);
ili9320_DrawPoint(200,50,charColor,Blue); //画一个点
ili9320_PutStr_16x24(248, 50, c4, 1, charColor, Blue); //显示单位:v
ili9320_PutChar_num(176,50,num32,charColor,Blue); //显示十位
ili9320_PutChar_num(224,50,num31,charColor,Blue); //显示个位
DAC->DHR12R1 = (vol*40950-230)/1304;
//先输入十位上的数键位,切换键,个位按键,确认键
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9))
Delay_ARMJISHU(300);
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9))
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9));
counter_3++;
if((!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)))
Delay_ARMJISHU(300);
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8))
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8));
if(!(counter_3%2))
if(num33<10) num33=num33+1;
if(num33>=10) num33=0;
if(counter_3%2)
if(num34<10) num34=num34+1;
if(num34>=10) num34=0;
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10)) //确认键
Delay_ARMJISHU(300);
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10))
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10));
vol=num32*10+num31;
//退出按键,在所有的功能中都使用这种退出方法
if(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5))
Delay_ARMJISHU(300);
if(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5))
while(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5));
exit=0;
ili9320_Clear(Blue);
num31=0;
num32=0;
vol=0;
num33=0;
num34=0;
//检测过流
ADCConvertedValueLocal = ADCConvertedValue;
Precent = (ADCConvertedValueLocal*100/0x1000); //算出百分比
Voltage = Precent*33;
while(Voltage>500)
ili9320_Clear(Blue);
while(1)
DAC->DHR12R1 = 0;
a1=0;
a2=0;
ili9320_Chinese_str(110,55,4,Chinese_Table_16x16_d,charColor,Blue);
ili9320_PutChar_num(176,50,a2,charColor,Blue);
ili9320_DrawPoint(200,50,charColor,Blue);//画一个点
ili9320_PutChar_num(224,50,a1,charColor,Blue);
ili9320_PutStr_16x24(248, 50, c4, 1, charColor, Blue);
ili9320_Chinese_str((320-16*10)/2,200,10,Chinese_Table_16x16_x,charColor,Blue);
GPIO_SetBits(GPIO_DAC,DS1_PIN|DS2_PIN); //所有引脚置高电平
/*--------------------------------------------------功能4:三角波--------------------------------------------------------------*/
//功能4:输出三角波 8号按键 :第一次使用的时候先输入一个值,然后确认,当确认完毕后,可以随意调节;再次按确认键停止工作
if(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8))
Delay_ARMJISHU(200);
if(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8))
while(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8));
exit=1;
ili9320_Clear(Blue);
vol_ap=20;
vol_fp=10;
while(exit)
//画波形的代码
ili9320_Chinese_str(90,120,9,Chinese_Table_16x16_ru,charColor,Blue);
ili9320_Chinese_str(90,55,5,Chinese_Table_16x16_fu,charColor,Blue); //电压幅值
ili9320_Chinese_str(90,85,3,Chinese_Table_16x16_pin,charColor,Blue); //频率
ili9320_Chinese_str(165,85,1,Chinese_Table_16x16_dang,charColor,Blue); //档
if((!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8))) //设置电压值:1号按键
Delay_ARMJISHU(200);
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8))
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8));
vol_ap=vol_ap+5;
if(vol_ap>95) vol_ap=20;
ili9320_PutStr_16x24(248, 50, c4, 1, charColor, Blue);
a1=(vol_ap)%10;
a2=(vol_ap-a1)/10;
ili9320_PutChar_num(176,50,a2,charColor,Blue);
ili9320_DrawPoint(200,50,charColor,Blue);//画一个点
ili9320_PutChar_num(224,50,a1,charColor,Blue);
if((!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9))) //设置频率:2号按键
Delay_ARMJISHU(200);
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9))
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9));
vol_fp=vol_fp+1;
if(vol_fp>10) vol_fp=1;
ili9320_PutChar_num(140,80,vol_fp,charColor,Blue);
if((!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10))) //第一次按的时候,确认开始
Delay_ARMJISHU(200);
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10))
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10));
ili9320_Clear(Blue);
ili9320_Chinese_str(20,100,16,Chinese_Table_16x16_bo,charColor,Blue); //电压幅值
while(1)
while((vol_apc>vol_pre)&(vol_apc<=(vol_ap*40950/1304)))
vol_pre=vol_apc;
vol_apc=vol_apc+vol_fp;
DAC->DHR12R1 =vol_apc;
while(vol_apc>(vol_ap*40950/1304))
vol_apc=vol_apc-2*vol_fp;
DAC->DHR12R1 =vol_apc;
while((vol_apc1))
vol_pre=vol_apc;
vol_apc=vol_apc-vol_fp;
DAC->DHR12R1 =vol_apc;
while(vol_apc<=vol_fp)
vol_apc=vol_apc+2*vol_fp;
DAC->DHR12R1 =vol_apc;
//退出按键,在所有的功能中都使用这种退出方法
if(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5))
Delay_ARMJISHU(300);
if(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5))
while(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5));
exit=0;
ili9320_Clear(Blue);
TIM_Cmd(TIM3,DISABLE);
//检测过流
ADCConvertedValueLocal = ADCConvertedValue;
Precent = (ADCConvertedValueLocal*100/0x1000); //算出百分比
Voltage = Precent*33;
while(Voltage>500)
ili9320_Clear(Blue);
while(1)
DAC->DHR12R1 = 0;
a1=0;
a2=0;
ili9320_Chinese_str(110,55,4,Chinese_Table_16x16_d,charColor,Blue);
ili9320_PutChar_num(176,50,a2,charColor,Blue);
ili9320_DrawPoint(200,50,charColor,Blue);//画一个点
ili9320_PutChar_num(224,50,a1,charColor,Blue);
ili9320_PutStr_16x24(248, 50, c4, 1, charColor, Blue);
ili9320_Chinese_str((320-16*10)/2,200,10,Chinese_Table_16x16_x,charColor,Blue);
GPIO_SetBits(GPIO_DAC,DS1_PIN|DS2_PIN); //所有引脚置高电平
/*-------------------------------------------------------------------------------------------------------------------------------*/
if(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5))
Delay_ARMJISHU(100);
if(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5))
while(!GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5));
exit_2=0;
ili9320_Clear(Blue);
相关参考
大家好,我是杂烩君。本次分享一个很久之前做的一个小模块。功能用STM32控制一个普通灯泡的亮度,一路开关控制普通灯泡电源的通断,另外两路开关分别控制普通灯泡亮度的增加和减小。调光控制器的原理通过STM32控制双向...
开发指纹模块(基于STM32 MCU和串口TFT LCD模块的指纹识别)
...的Amy的一篇客座文章,STONE技术公司是一家专门从事工业液晶显示模块的公司。2019年11月,我计划开发一个指纹门锁项目。当我选择好指纹识别模块时,项目就被暂停了。不过,我想既然已经购买了指纹识别模块,那还是简单地...
智能照明调光控制器模块(基于STM32实现的普通灯泡调光模块)
大家好,我是杂烩君。本次分享一个很久之前做的一个小模块。功能用STM32控制一个普通灯泡的亮度,一路开关控制普通灯泡电源的通断,另外两路开关分别控制普通灯泡亮度的增加和减小。调光控制器的原理通过STM32控制双向...
智能纯净水表(动手实践丨手把手教你用STM32做一个智能鱼缸)
摘要:本文基于STM32单片机设计了一款基于物联网的智能鱼缸。本文分享自华为云社区《基于STM32+华为云IOT设计的物联网鱼缸【玩转华为云】-云社区-华为云》,作者:DS小龙哥。1.前言为了缓解学习、生活、工作带来的压力,提...
数字显示仪怎么接线(西门子S7-300数字量模块如何接线?)
一、数字量输入模块SM321。数字量输入模块将现场过程送来的数字信号电平转换成S7-300内部信号电平。数字量输入模块SM321有四种型号模块可供选择,即直流16点输入、直流32点输入、交流16点输入、交流8点输入模块。我们常用的...
湿度传感器实验报告总结(I2C通信实例 - SHTx温湿度传感器 02)
...2Project,配置好时钟等(参考前文)。STM32F103ZET6有两个I2C模块,这里选用的是I2C2。参数设置非常简单,如图1所示:图1.I2C配置界面从左侧Connectivity组选择I2C2;Mode下拉列表,选择I2C。从下方ParameterSettin
湿度传感器实验报告总结(I2C通信实例 - SHTx温湿度传感器 02)
...2Project,配置好时钟等(参考前文)。STM32F103ZET6有两个I2C模块,这里选用的是I2C2。参数设置非常简单,如图1所示:图1.I2C配置界面从左侧Connectivity组选择I2C2;Mode下拉列表,选择I2C。从下方ParameterSettin
开源数控仿真(「单片机开源」大神教你数控电源 附数控电源全部资料)
...T7565R,对液晶屏的使用其实很简单,不用管是哪家公司的模块,只要连线不错,知道驱动芯片的操作方式就很简单。配套液晶PDF资料:12864G中文说明书_2.pdf以下是驱动芯片资料:ST7565S_data
...各位的支持是本人持续输出的动力,多谢多谢!#30天学会STM32##STM32单片机##单片机#本章我们延续上一章
常用的译码芯片(学嵌入式STM32系列芯片应该怎么选择,都有什么区别)
学嵌入式STM32系列芯片应该怎么选择,都有什么区别单片机相对来说更容易了解计算机底层的东西,还有硬件什么的,玩过单片机的人对IT产业高低游的了解不是一般软件专业出来能够比的。学嵌入式最大的乐趣在于,我搞出来...