STM32数控直流电源.docx
- 文档编号:7703090
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:23
- 大小:239.45KB
STM32数控直流电源.docx
《STM32数控直流电源.docx》由会员分享,可在线阅读,更多相关《STM32数控直流电源.docx(23页珍藏版)》请在冰豆网上搜索。
STM32数控直流电源
STM32数控直流电源
1、介绍…………
2、整体方案…………3、硬件电路…………4、软件…………5、心得小结…………6、附录:
1、元器件…………
2、电路图…………
3、代码…………
1、介绍:
这个数控直流电源,是基于CORTEX_M3的STM32F103ZET6芯片的一个制作。
它的能实现0~的电压变化,每次变化为。
它采用了内部的12位DAC和12位的ADC,精度比普通的8位ADC高出16倍,在实际的测试中,本制作的精度达到。
本制作可以实现按键加减电压大小、按键自动调节电压、输入数值控制输出电压、输出幅值频率可调的三角波功能。
同时,本制作采用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*240tftlcd,24V变压器、按键模块、LM7805、LM7815、LM2940等
2、原理图:
3、源程序:
主函数部分:
intmain(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;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32 数控 直流电源