STM32数控直流电源.docx
- 文档编号:18423732
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:24
- 大小:422.92KB
STM32数控直流电源.docx
《STM32数控直流电源.docx》由会员分享,可在线阅读,更多相关《STM32数控直流电源.docx(24页珍藏版)》请在冰点文库上搜索。
STM32数控直流电源
STM32数控直流电療
1、介绍
2、整体方案
3、硬件电路
4、软件
5、心得小结
6、附录:
1、元器件
2、电路图
3、代码
1、介给:
这个数控直滾电源,是基于C0RTEX.M3的STM32F103ZET6芯片的一个制作。
它的能实观0~9.9V的电压变化,每次变化为0.1Vo它采用了册的12位DACfll12位的ADC,精度比普通的8I5ADC高出16倍,在实际的测试中,本制作的精度这到0.01Vo本制作可以实现按»jnM电压大小、按建自动调节电压、输人数值控制输出电压、输岀幅值*i率可调的三角波助能。
同时,本斟作果用320*240的LCD液晶显示,并且在显示的基础上,制作了完整的用户界面,大大方便了用户的使用。
2、整体方案:
方案介鉛:
本方案围绕stm32芯片,由供电模決、液晶显示模快、报警模決、负载电流检测模快、电源产生模決、按理模快构成。
电源模块:
找采用的是桥式整流给合三端稳压茹片的处理方法。
由此得到单片机使用的5v电源和驱动运算朋大器的12V电源。
电源发生模快:
这个系筑由LM358运算放大器和stm32芯片郡12位DAC组成。
负莪电流检測模唤个模块由stm328812EADC和自制的1朋姐康鋼电叽组成。
液晶显示模決:
主要有320*240LCD组成,负责显示参数和提哄用户服务界面。
11流报書模快:
这个部分由聲鸣器和红色的LED拒示灯组成。
负责当发生11流观象时,给用户报警。
按罐模快:
这是本系貌的用户腔制方式。
3、硕件电路
(1)、stm32f103zet6单片机最小系统:
这款ST公司生产的基干cortex_m3核的芯片,在当今的电子产品领域占有很大的市场。
2ft32位芯片,有144个引脚、512K的rom、2»ADC支持16通道,2路DAC,14个定时器,spi通信、i2c通信、串口通信方式。
对于本系统,这个芯片的已经足够。
(2R电源电路
电源模块
在STiili分,我主要果用桥式整流,使用了IB个耐圧10OOvin4007,將双24V的变压器得到的剧遡电压进行整流,再由10OOuf电容和LM7815和LM2940穩压得系统所需的5V和12V电源。
(3)、电源产生电路和检测电路
U1
在运算放大器部分,我选择的是带宽1M1的LM358,采用1k的精密电皿,将DA得到的电源放大4倍,再经过一级的放大器跟!
®电路输人到负载电路之中。
负载串联了10:
姆的康鋼电阻,康狷电阻的温漂小,直接ADi量两竭的电压便可得到负载的电流状况。
(4)、显示电路:
1
J1
GhE
Vice
£80:
3
■JJ
4
XfiOO■
■
■
CB03
5
L&D1
:
BOJ
D&X
■
6EB32■
QD
■
roos
7
8
■
I&04■
■
EH07
9
|L
L1:
C
10
■
£BJ6■
■
XXIO9
12
■
0)09.
■
rail
13
□3K
□B11
14
tBIO■
■
■
L8L3
15
CB13
CRM
16
■
■
■
£B13
17
16
■
£BL4.
PS
19
□e
20 gcs■ ■ ■ /JU) 21 RD 3L.EH 1NT c i\口 22 ■ /HR■ ■ CL£K 23 应SEI MlSC 24 ■ ■ /INT 25 ? 6 ■ MSC■ ■ ■ IE 27 28 ■ M^Sl■ ■ ■ 冋ec 20 BFns y1k 艾 ■ C2LK■ /SDC$ 31 an >vLr m**c 32 ■ /r? eg■ •1尸 KUX盯 果用的是HI9320®的320*240方案。 (5R报警电路和按建电路灯省峪。 4、軟件部分: 主It程序流程图 开始 主循环 在程序设廿部分,主要设itADC和DAC以及定时器中断和外部触发 中断的使用。 5、心得小结 在本次设廿中,前期我花费了大量的时间査阅论文和思考放大电路设计上,而最后经过试验,还是选择了简单而实用的放大器加更师器的方案。 在设廿过程中遇到过很麻烦的事,当时网购了DAC7512的12位DAC芯片,发规是很小的贴片,经过较长时间搞定之后,一次使用过程中,这块苏片坏了。 于是,不得不转到当前采用的方案上。 这个教i)ll,it我明白实践和试验的重要性,少走弯路,多做实用的事。 6、附录: 1、元器件清单: stm32f103zet6单片机最小系貌,320*240tftled, 24V变压器、按鍵模挟、LM7805.LM7815.LM2940等 2、原理图: 3、湄程序: 主函数部分: intmain(void) whiled)〃主fli坏 DAC->DHR12R1=0; ili9320_Chinese_str((320-16*17)/2,50,17,Chinese_TableJ6x16_nan,charColor,Blue); ili9320_Chinese_str(70.90,3tChinese_TableJ6x16Ji? charColor? Blue); ili9320_Chinese_str(140,90.8,Chinese_Table_16x16_shu,charColor,Blue); ili9320-Chinese_str((320-16*15)/2,200,15,Chlnese_TableJ6x16_zun,charColor,Blue);if(! GPIO_ReadlnputDataBit(GPIOG.GPIO_Pin_5)) { Delay.ARMJISHU(IOO); while(! GPI0_ReadlnputDataBit(GPI0G,GPI0_Pin^5)); ili9320_Clear(Blue); exiL2=1; while(exiL2)〃按人功能術坏 { DAC->DHR12R1=0; ili9320_Chinese_str(0.10.6.Chinese_TableJ6x16_1,charColor,Blue); ili9320_Chinese_str(0.40.6.Chinese_TableJ6x16_2gfcharColor.Blue); ili9320_Chinese_str(0.70.6tChinese_Table_16x16_3xharColor,Blue); ili9320_Chinese_str(0.100,3,Chinese_Table_16x16_4,charColor,Blue); //ili9320_Chinese_str(0,130.2,Chinese_TableJ6x16.5,charColor,Blue); 〃功能一: 手动加菽电压曽 if(! GPIO_ReadlnputDataBit(GPIOA,GPIO_PinJ2)) Delay_ARMJISHU(200);if(! GPIO_ReadlnputDataBit(GPIOA,GPIO_Pin_12)){ while(! GPI0.ReadlnputDataBit(GPI0A9GPIO_PinJ2));ili9320_Clear(Blue); exit=1; while(exit) { ili9320_Chinese_str(110,55.4? Chinese_Table_16x16_d,charColortBlue); ili9320_PutStr_16x24(24&50,c4,1,charColor,Blue);a1=(vol+1)%10; a2=(vol+1-a1)/10;ili9320_PutChar_num(176,50ta2fcharColocBlue); ili9320_DrawPoint(200,50,charColor,Blue)y/H一个点 ili9320_PutChar_num(224t50.a1fcharColor,Blue); 〃+ if(! GPIO_ReadlnputDataBlt(GPIOA,GPI0.Pin_8)) Delay_ARMJISHU(300);if(! GPI0_ReadlnputDataBit(GPI0A,GPI0_Pin^8)) { if(vol<99) vol=vol+1; }while(! GPIO_ReadlnputDataBit(GPIOA,GPI0_Pin_8)); } } if(! GPI0_ReadlnputDataBit(GPI0A,GPI0_Pin.9))//- { Delay_ARMJISHU(300); if(! GPIO_ReadlnputDataBit(GPIOA,GPI0_Pin.9)) { if(vol>3) vol=vol-1;while(! GPIO_ReadlnputDataBit(GPIOA,GPI0_Pin_9));} } DAC->DHR12R1=(vor40950-230)/1304; 〃购測ust ADCConvertedValueLocal=ADCConvertedValue; Precent=(ADCConvertedValueLocal*100/0x1000);〃算岀百分比 Voltage=Precent*33; while(Voltage>500) { ili9320_Clear(Blue); whiled) 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,200d0? Chinese_Table_16x16_x1charColor.Blue);GPIO_SetBits(GPIO_DAC,DS1.PIN|DS2_PIN); //除有引use电平 } } 〃退出按理,在Wi有的妙能中部使用这种退岀方法 if(! GPIO_ReadlnputDataBit(GPIOGfGPIO_Pin_5)) Delay_ARMJISHU(300); if(! GPIO_Rea(ilnputDataBit(GPIOG,GPIO_Pin_5)) { while(! GPIO^ReadlnputDataBit(GPIOGfGPIO.Pin_5)); exit=0; vol=0; ili9320_Clear(Blue); } } 〃助能2: 自动flOJl电压值(6号按理) if(! GPI0_ReadlnputDataBit(GPI0CtGPI0_Pin_6)) { Delay_ARMJISHU(200); if(! GPI0_ReadlnputDataBit(GPI0CtGPI0_Pin_6)) { exit=1; while(! GPIO_ReadlnputDataBit(GPIOC,GPIO_Pin.6)); r功能2的定耐器初始化7 Timer_Config(); NVIC_Config(); TIM_Cmd(TIM2,DISABLE);//fiffl是关闻的,当进人功能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);//H一f点ili9320_PutChar_num(224f50ta1,charColor,Blue); //自加甘描 if(! GPIO_ReadlnputDataBit(GPIOA.GPIO_Pin_8)&counter21) flag2=1; Delay_ARMJISHU(200); if(! GPIO_ReadlnputDataBit(GPIOA,GPIO_Pin^8)) { TIM_Cmd(TIM2,ENABLE); counter21=0; while(! GPIO_ReadlnputDataBit(GPIOA. GPI0_Pin_8)); if(! GPIO_ReadlnputDataBit(GPIOA.GPIO_Pin_8)&! counter21) Delay_ARMJISHU(200); if(! GPIO_ReadlnputDataBit(GPIOA.GPIO_Pin-8)) { TIM_Cmd(TIM2,DISABLE); counter21=1; while(! GPIO_ReadlnputDataBit(GPIOA, GPI0_Pin_8)); //自輪扫描 if(! GPIO_ReadlnputDataBit(GPIOA.GPIO_Pin_9)&counter22) flag2=0; Delay_ARMJISHU(200);if(! GPI0_ReadlnputDataBit(GPI0A,GPI0_Pin_9)) { TIM_Cmd(TIM2.ENABLE); counter22=0; while(! GPIO_ReadlnputDataBit(GPIOA, GPI0_Pin_9)); if(! GPI0_ReadlnputDataBit(GPI0A.GPI0_Pin_9)&! counter22) Delay_ARMJISHU(200); if(! GPI0_ReadlnputDataBit(GPI0A,GPI0_Pin_9)) { TIM_Cmd(TIM2,DISABLE); counter22=1; while(! GPIO_ReadlnputDataBit(GPIOA. GPI0_Pin_9)); DAC->DHR12R1=(vol70950-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,charColocBlue); ili9320_DrawPoint(200,50,charColor,Blue);/7B一个点ili9320_PutChar_num(224,50,a1.charColor,Blue);ili9320_PutStr_16x24(24&50? c4,l.charColor,Blue); ili9320_Chinese_str((320-16*10)/2.200d0? Chinese_TableJ6x16_x,charColor.Blue);GPIO_SetBits(GPIO_DAC,DS1_PIN|DS2_PIN); 〃障有引电平 } } //iBll}按it,在两有的M能中②便用泄牌担出方法 if(! GPIO_ReadlnputDataBit(GPIOGfGPIO_Pin_5)) Delay_ARMJISHU(100);if(! GPI0_ReadlnputDataBit(GPI0G,GPI0_Pin.5)) {while(! GPI0_ReadlnputDataBit(GPI0G,GPI0^Pin_5));exit=O; TIM_Cmd(TIM2,DISABLE); vol=0; voL22=0; ili9320_Clear(Blue); } } } //助能3: 输人电压数值7号助能霞 if(! GPI0_ReadlnputDataBit(GPI0CtGPI0_Pin_7)) { Delay_ARMJISHU(100); if(! GPIO_ReadlnputDataBit(GPIOC,GPIO_Pin_7)) { exit=1; while(! GPIO_ReadlnputDataBit(GPIOC.GPIO_Pin_7));ili9320_Clear(Blue); while(exit) num31=num33; num32=num34; ili9320_Chinese_str(10.12J2.Chinese_Table_16x16_q.charColor,Blue); ili9320_Chinese_str(110.55,4fChinese_TableJ6x16_d,charColor.Blue); ili9320_DrawPoint(200,50,charColor,Blue); 〃画一个点 ili9320_PutStd6x24(24&50,c4.1,charColor,Blue); 〃显示甲位: V ili9320_PutChar_num(176,50fnum32,charColorlBlue); 〃显示十也 ili9320_PutChar_num(224,50,num31,charColor,Blue); 〃显示个位 DAC->DHR12R1=(vor40950-230)/1304; //先输人十位上的数建位,切狈浪,个位 按理•确从理 if(! GPI0_ReadlnputDataBit(GPI0A? GPI0_Pin_9)) { Delay_ARMJISHU(300); if(! GPIO_ReadlnputDataBit(GPIOA,GPI0_Pin_9)) { while(! GPIO_ReadlnputDataBit(GPIOA.GPI0_Pin_9));counter_3++; } } if((! GPIO_ReadlnputDataBit(GPIOA? GPI0_Pin_8))) { Delay.ARMJISHU(300); if(! GPIO_ReadlnputDataBit(GPIOA.GPI0_Pin_8)) { while(! GPIO_ReadlnputDataBit(GPIOA.GPI0_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_ReadlnputDataBit(GPIOA.GPIO_Pin_10)) Delay_ARMJISHU(300); if(! GPIO_ReadlnputDataBit(GPIOA.GPIO_PinJO)) {while(! GPIO_ReadlnputDataBit(GPIOA.GPIO_Pin_10));vol=num32*10+num31; 〃退出按it,在陳有的助能中部使用这牌IB出方进 if(! GPIO_ReadlnputDataBit(GPIOG? GPIO_Pin_5)) Delay_ARMJISHU(300);if(! GPIO_ReadlnputDataBit(GPIOG,GPIO_Pin_5)) { while(! GPIO^ReadlnputDataBit(GPIOG1GPIO_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; wtiile(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);Z/iHj一个点ili9320_PutChar_num(224t50.a1tcharColor,Blue);ili9320_PutStLl6x24(24&50,c4,1.charColor,Blue); ili9320_Chinese_str((320-16*10)/2,200,10.Chinese^TableJ6x16_x,charColor,Blue); GPIO.Se⑻ts(GPIO_DAGDS1_PIN|DS2_PIN);〃瞬有 弓I脚置高电平 } } i<■»«■»J 〃功能4: 输岀三角渋8号按理: 縮一次使用的时候先输人一个値,然后确认,当确从完毕后,可Jin豆阅节;再次按礴汰腿|? 止工作 if(! GPIO_ReadlnputDataBit(GPIOC,GPIO.Pin_8)) { Delay_ARMJISHU(200); if(! GPIO_ReadlnputDataBit(GPIOC,GPIO_Pin_8)) { while(! GPIO_ReadlnputDataBit(GPIOC? GPI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32 数控 直流电源