




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、桂林理工大学Guilin University of Technology电子系统设计创新与实践实习报告实习名称:电子系统设计创新与实践设计题目:数控恒流源 专业班级:电子信息工程13-3班 姓 名:徐XX 学号 指导老师:金X 李XX 实习时间:2016年3月1日至2016年3月25日 目 次第1章 绪论.1第2章 总体技术方案.1第3章 硬件系统设计.2第4章 软件系统设计.4第5章 装置样机的制作与调试 .17第6章 实验测试.18第7章 总 结.18参考文献.191. 绪论1.1 题目数控恒流源设计。1.2 研究目标与意义(1) 总体目标(1)输入电压:交流24V;(2)输出电流:20
2、0500mA可调;(3)电阻性负载,负载电阻范围:201K;(4)负载电阻上最大输出电压:25V;(限制最大功率,在功率允许范围内保证恒流指标);(5)要求在输入交流电压变化±15%时,输出电流变化不大于±2%;(6)要求在负载电阻在201K之间变化时,输出电流变化不大于±2%;(7)数字显示输出电流、输出电压;(8)数字分档控制输出电流,相邻两档步进量10mA;(2)研究意义目前市面上恒流源效率低、精度低、响应速度慢、调整校正时间长、方法复杂、扩展升级性能较差等缺点,难以提高产品竞争力。实际应用中很多地方都需要用到高效恒定电流源,特别是现代消费类电子、控制类电子
3、、电力电子技术、仪器与仪表、大屏幕高亮度LED等对电源要求特别高而且敏感1,高性能电源可以极大提高电子产品使用寿命和稳定性。基于MSP430单片机低功耗高效数控恒流源,具有精度高、效率高,响应速度快、适应性强、输出不随输入电压、负载变化而变化等特点,输出200mA-500mA恒定直流电流,采用单片机A/D和D/A转换模块TLC5615输出,输出效率可达90以上,具有广阔市场应用前景。2.总技术方案 控制部分供电电源恒流部分供电电源接口电路单片机D/A恒流源电路LCD显示键盘A/D 图2.1数控恒流源原理框图3硬件系统设计3.1硬件原理图如图3.1所示,硬件电路总原理图。具体模块工作功能将由负责
4、硬件电路的组员吴龙俊阐述,在此不行复述。图3.1硬件总原理图3.2 PCB布线具体布线工作由组员进行,我还是动手做了部分布线,最后没有得到导师金红老师的通过,由吴龙俊进行了最后布置与修改,从吴龙俊身上学到了不少技巧,感谢本次实习。图3.2PCB布线4.软件系统设计4.1程序流程图开始While主循环A/D采样LCD显示KEY2判断键值调用键值子程序2调用键值子程序2D/A转换LCD显示返回主循环4.2程序设计总方案由于本人在本次实习中负责软件程序调试,经过多次硬件改变,做出多次程序改变,最终因成品未定,所以方案有所不同。4.2.1方案一:用MSP430F149ADC12进行,DA采用TLC56
5、15芯片,LCD用八线。程序包括LCD显示、AD采样、键值处理、键值子程序、DA芯片驱动程序(请分栏阅读)#include <msp430x14x.h>#include "cry1602.h"/*宏定义*/#define uchar unsigned char#define uint unsigned int#define Num_of_Results 32#define bell_delay 7000#define keyin (P1IN & 0x03) /K1=p1.0 k2p1.1#define DataDir P4DIR#define DataP
6、ort P4OUT#define Busy 0x80#define CtrlDir P3DIR#define CLR_RS P3OUT&=BIT0; /RS = P3.0#define SET_RS P3OUT|=BIT0;#define CLR_RW P3OUT&=BIT1;/RW = P3.1#define SET_RW P3OUT|=BIT1;#define CLR_EN P3OUT&=BIT2;/EN = P3.2#define SET_EN P3OUT|=BIT2;#ifndef _TLC5615_H_fengcheng_ #define _TLC5615_H
7、_fengcheng_ #define DA_DIN BIT5 #define DA_SCLK BIT6 #define CS BIT7 void delay20ms(void);unsigned long Curr_Volt;uchar shuzi = "0123456789."uchar tishi = "The volt is:"static uint resultsNum_of_Results; /保存ADC转换结果的数组 / is not used for anything.void Trans_val(uint Hex_Val); /*主函数
8、*/void main(void) uchar keyval;/定义全局变量 WDTCTL = WDTPW+WDTHOLD; /关闭看门狗 while(1) /按键程序循环 LcdReset(); /复位1602液晶 DispNChar(2,0,12,tishi); /显示提示信息 Disp1Char(11,1,'V'); /显示电压单位 P6SEL |= 0x01; / 使能ADC通道 ADC12CTL0 = ADC12ON+SHT0_8+MSC; / 打开ADC,设置采样时间 ADC12CTL1 = SHP+CONSEQ_2; / 使用采样定时器 ADC12IE = 0x0
9、1; / 使能ADC中断 ADC12CTL0 |= ENC; / 使能转换 ADC12CTL0 |= ADC12SC; / 开始转换 _EINT(); LPM0; P1DIR = 0xfc; /设置P1.6P1.7为键盘输入状态 P1DIR |=0XE0; /设置P1.5P1.7为DA输出状态 /P1SEL |=0x07; while(1) if(keyin != 0x03) delay20ms(); if(keyin != 0x03) keyval = keyin; while(keyin != 0x03); /等待按键放开 if(keyval = 0x02) /如果是 K1 键按下- p1
10、.0 Curr_Volt += 10; /DAC 的输出增加 20 个偏置量 Curr_Volt |=BIT5; /输出P1.5 else if(keyval = 0x01) /如果是 K2 键按下 p1.1 Curr_Volt -= 10; /AD 的输出减少1 0 个偏置量 Curr_Volt |=BIT5; /输出P1.5 /*函数名称:ADC12ISR功 能:ADC中断服务函数,在这里用多次平均的 计算P6.0口的模拟电压数值参 数:无 返回值 :无*/#pragma vector=ADC_VECTOR_interrupt void ADC12ISR (void) static uin
11、t index = 0; resultsindex+ = ADC12MEM0; / Move results if(index = Num_of_Results) uchar i; unsigned long sum = 0; index = 0; for(i = 0; i < Num_of_Results; i+) sum += resultsi; sum >>= 5; /除以32 Trans_val(sum); /*函数名称:Trans_val功 能:将16进制ADC转换数据变换成三位10进制 真实的模拟电压数据,并在液晶上显示参 数:Hex_Val-16进制数据 n-变
12、换时的分母等于2的n次方 返回值 :无*/void Trans_val(uint Hex_Val) unsigned long caltmp; uint Curr_Volt; uchar t1,i; uchar ptr4; caltmp = Hex_Val; caltmp = (caltmp << 5) + Hex_Val; /caltmp = Hex_Val * 33 caltmp = (caltmp << 3) + (caltmp << 1); /caltmp = caltmp * 10 Curr_Volt = caltmp >> 12; /
13、Curr_Volt = caltmp / 2n Curr_Volt是转换完的10位数 ptr0 = Curr_Volt / 100; /Hex->Dec变换 t1 = Curr_Volt - (ptr0 * 100); ptr2 = t1 / 10; ptr3 = t1 - (ptr2 * 10); ptr1 = 10; /shuzi表中第10位对应符号"." /在液晶上显示变换后的结果 for(i = 0;i < 4;i+) Disp1Char(6 + i),1,shuziptri);/*函数名称:delay20ms功 能:用于消抖的延时参 数:无返回值 :无
14、*/void delay20ms(void) uint tmp; for(tmp = 12000;tmp > 0;tmp-); /* P1.5-DIN-|1 8|-VDD- P1.6-SCLK-|2 7|-OUT- P1.7-CS-|3 6|-REFN- DOUT-|4 5|-AGND- 参考电压,约1.5V最佳(此时最大输出约3V) D/A转换芯片 TLV5615 */ void delay(uint z) uint x,y; for(x=110;x>0;x-) for(y=z;y>0;y-); /DA转换函数,使用示范: /DA(0x3ff*0.1);0x3ff为满值,对
15、应3V,0.1为倍数,此时输出0.3v。/编程软件可能提示警告,原因是参数中的0.1与0x3ff并非同一类型值,/但是无需理会,不影响结果void DA(uint date) P1DIR|=0xE0; /P1.5-P1.7设置为输出 uchar i; int din; date<<=6; P1OUT&= DA_SCLK; /sck=0; P1OUT&= CS; / cs=0; for(i=0;i<12;i+) din=date&0x8000; if(din=0) P1OUT&= DA_DIN; else P1OUT|= DA_DIN; P1OU
16、T|= DA_SCLK; /sck=1; date<<=1; P1OUT&= DA_SCLK; /sck=0; P1OUT|= CS; / cs=1; #endif/*函数名称:DispNchar功 能:让液晶从某个位置起连续显示N个字符参 数:x-位置的列坐标 y-位置的行坐标 n-字符个数 ptr-指向字符存放位置的指针返回值 :无*/void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) uchar i; for (i=0;i<n;i+)Disp1Char(x+,y,ptri);if (x = 0x0f) x =
17、0; y = 1;/*函数名称:LocateXY功 能:向液晶输入显示字符位置的坐标信息参 数:x-位置的列坐标 y-位置的行坐标返回值 :无*/void LocateXY(uchar x,uchar y) uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; /如果在第2行temp |= 0x80; LcdWriteCommand(temp,1);/*函数名称:Disp1Char功 能:在某个位置显示一个字符参 数:x-位置的列坐标 y-位置的行坐标 data-显示的字符数据返回值 :无*/void Disp1Char(
18、uchar x,uchar y,uchar data) LocateXY( x, y );LcdWriteData( data );/*函数名称:LcdReset功 能:对1602液晶模块进行复位操作参 数:无返回值 :无*/void LcdReset(void) CtrlDir |= 0x07; /控制线端口设为输出状态 DataDir = 0xFF; /数据端口设为输出状态 LcdWriteCommand(0x38, 0); /规定的复位操作Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Del
19、ay5ms();LcdWriteCommand(0x38, 1);/显示模式设置 LcdWriteCommand(0x08, 1);/显示关闭 LcdWriteCommand(0x01, 1); /显示清屏LcdWriteCommand(0x06, 1);/写字符时整体不移动LcdWriteCommand(0x0c, 1);/显示开,不开游标,不闪烁/*函数名称:LcdWriteCommand功 能:向液晶模块写入命令参 数:cmd-命令, chk-是否判忙的标志,1:判忙,0:不判返回值 :无*/void LcdWriteCommand(uchar cmd,uchar chk) if (ch
20、k) WaitForEnable(); / 检测忙信号?CLR_RS;CLR_RW; _NOP();DataPort = cmd; /将命令字写入数据端口 _NOP();SET_EN; /产生使能脉冲信号_NOP();_NOP();CLR_EN;/*函数名称:LcdWriteData功 能:向液晶显示的当前地址写入显示数据参 数:data-显示字符数据返回值 :无*/void LcdWriteData( uchar data ) WaitForEnable(); /等待液晶不忙SET_RS;CLR_RW; _NOP(); DataPort = data; /将显示数据写入数据端口 _NOP()
21、;SET_EN; /产生使能脉冲信号_NOP(); _NOP(); CLR_EN;/*函数名称:WaitForEnable功 能:等待1602液晶完成内部操作参 数:无返回值 :无*/void WaitForEnable(void) P4DIR &= 0x00; /将P4口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN; _NOP();_NOP();while(P4IN & Busy)!=0); /检测忙标志CLR_EN; P4DIR |= 0xFF; /将P4口切换为输出状态 /*函数名称:Delay5ms功 能:延时约5ms参 数:无返回值 :无*/v
22、oid Delay5ms(void) uint i=40000; while (i != 0) i-; /*函数名称:Delay400ms功 能:延时约400ms参 数:无返回值 :无*/void Delay400ms(void) uchar i=50;uint j; while(i-)j=7269;while(j-);4.2.2方案二:用MSP430F149ADC12进行,DA采用单片机内部程序处理,LCD用八线。由于调试主板硬件时导致DA芯片烧坏,故采用备用方案(下面程序请分栏阅读)#include "msp430f149.h"#include "cry160
23、2.h"#include "IIC.h"typedef unsigned char uchar;typedef unsigned int uint;/*LCD1602端口定义*/#define dat P4OUT /定义LCD1602的数据口为P4#define CLR_RS P3OUT &=BIT0 /置零P3.0位,也就是置零RS#define SET_RS P3OUT |=BIT0 /置壹P3.0位,也就是置壹RS#define CLR_RW P3OUT &=BIT1 /置零P3.1位,也就是置零RW#define SET_RW P3OUT
24、|=BIT1 /置壹P3.1位,也就是置壹RW#define CLR_EN P3OUT &=BIT2 /置零P3.2位,也就是置零EN#define SET_EN P3OUT |=BIT /置壹P3.2位,也就是置壹EN/*TLC5615端口定义*/#define DA_DIN_SET P1OUT |= BIT2 /CS=P1.0#define DA_DIN_CLR P1OUT &= BIT2#define DA_SCLK_SET P1OUT |= BIT1 /SCK=P1.1#define DA_SCLK_CLR P1OUT &= BIT1#define DA_CS_
25、SET P1OUT |= BIT0 /SCK=P1.2#define DA_CS_CLR P1OUT &= BIT0/*独立键盘端口定义*/#define keyin (P1IN & 0xc0) /K1=p1.7 k2p1.6#define Num_of_Results 32uchar shuzi = "0123456789."uchar tishi = "The volt is:"static uint resultsNum_of_Results; /保存ADC转换结果的数组 / is not used for anything.uch
26、ar DAC_Val; /DAC 输出数据void delay20ms(void); /延时uchar Write_DAC(uchar wdata);void Trans_val(uint Hex_Val); /转换AD真是模拟量并显示void main( void ) uchar keyval; WDTCTL = WDTPW + WDTHOLD; /停止看门狗 P3DIR |0x07; /设置lcd1602输出方向 P3SEL |0x07; P4DIR |=0xff; LcdReset(); /复位1602液晶 DispNChar(2,0,12,tishi); /显示提示信息 Disp1Ch
27、ar(11,1,'V'); /显示电压单位 P6SEL |= 0x01; / 使能ADC通道 ADC12CTL0 = ADC12ON+SHT0_8+MSC; / 打开ADC,设置采样时间 ADC12CTL1 = SHP+CONSEQ_2; / 使用采样定时器 ADC12IE = 0x01; / 使能ADC中断 ADC12CTL0 |= ENC; / 使能转换 ADC12CTL0 |= ADC12SC; / 开始转换 _EINT(); LPM0; /IO端口的选择 Set_IO(); /设置 IIC 端口 P1DIR = 0x3f; /设置P1.6P1.7为键盘输入状态 P1DI
28、R |=0x07; /设置P1.0P1.2为DA输出状态 P1SEL |=0x07; DAC_Val = 0xff; Write_DAC(DAC_Val); while(1) if(P1IN & 0xc0) != 0xc0) delay20ms(); if(P1IN & 0xc0) != 0xc0) keyval = P1IN & 0xc0; while(P1IN & 0xc0) != 0xc0); /等待按键放开 if(keyval = 0x40) /如果是 K1 键按下- p1.7 DAC_Val -= 10; /DAC 的输出减少 10 个偏置量 Writ
29、e_DAC(DAC_Val); /写入 DAC else if(keyval = 0x20) /如果是 K2 键按下 p1.6 DAC_Val += 10; /DAC 的输出增加 10 个偏置量 Write_DAC(DAC_Val); /写入 DAC else _NOP(); /*函数名称:delay20ms功 能:用于消抖的延时参 数:无返回值 :无*/void delay20ms(void) uint tmp; for(tmp = 12000;tmp > 0;tmp-);/*函数名称:Write_DAC功 能:向 DAC 中写入输出电压数据参 数:无返回值 :写入结果:1-成功,0-
30、失败*/uchar Write_DAC(uchar wdata) start(); write1byte(0x98); /DAC 的设备地址 if(check() write1byte(wdata >> 4); /写控制模式和电压数据的高四位 else return 0; if(check() write1byte(wdata << 4); /写电压数据的低四位 else return 0; if(check() stop(); else return 0; return 1;/*函数名称:ADC12ISR功 能:ADC中断服务函数,在这里用多次平均的 计算P6.0口的
31、模拟电压数值参 数:无返回值 :无*/#pragma vector=adc12_vector_interrupt void ADC12ISR (void) static uint index = 0; resultsindex+ = ADC12MEM0; / Move results if(index = Num_of_Results) uchar i; unsigned long sum = 0; index = 0; for(i = 0; i < Num_of_Results; i+) sum += resultsi; sum >>= 5; /除以32 Trans_val
32、(sum); /*函数名称:Trans_val功 能:将16进制ADC转换数据变换成三位10进制 真实的模拟电压数据,并在液晶上显示参 数:Hex_Val-16进制数据 n-变换时的分母等于2的n次方返回值 :无*/void Trans_val(uint Hex_Val) unsigned long caltmp; uint Curr_Volt; uchar t1,i; uchar ptr4; caltmp = Hex_Val; caltmp = (caltmp << 5) + Hex_Val; /caltmp = Hex_Val * 33 caltmp = (caltmp <
33、;< 3) + (caltmp << 1); /caltmp = caltmp * 10 Curr_Volt = caltmp >> 12; /Curr_Volt = caltmp / 2n ptr0 = Curr_Volt / 100; /Hex->Dec变换 t1 = Curr_Volt - (ptr0 * 100); ptr2 = t1 / 10; ptr3 = t1 - (ptr2 * 10); ptr1 = 10; /shuzi表中第10位对应符号"." /在液晶上显示变换后的结果 for(i = 0;i < 4;i+)
34、Disp1Char(6 + i),1,shuziptri);4.2.3方案三:用MSP430G2553ADC10进行,DA采用TLC5615,LCD用四线。由于同题目另一小组将单片机430F149损坏,而且我们经导师同意再次购买TLC5615芯片,故调换单片机给领外一组,本人再次调整程序(下面程序请分栏阅读)#include<msp430.h>#define LCD_EN_PORT P1OUT /以下2个要设为同一个口#define LCD_EN_DDR P1DIR#define LCD_RS_PORT P1OUT /以下2个要设为同一个口#define LCD_RS_DDR P1
35、DIR#define LCD_DATA_PORT P2OUT /以下3个要设为同一个口#define LCD_DATA_DDR P2DIR /一定要用高4位#define LCD_RS BIT6#define LCD_EN BIT7#define LCD_DATA BIT7|BIT6|BIT5|BIT4 /4位数据线连接模式#define DA_DIN BIT0 /*TLC5615端口定义*#define DA_SCLK BIT1#define CS BIT2/*独立键盘端口定义*/#define keyscan (P1IN & 0xc0) /K1=p1.7 k2p1.6#define
36、 KEY_IN (P1IN & 0X03) /按键P2.0-p2.1float aa=300;/初始值300mAfloat zh(float z);void key_int(void);void DA_conver(unsigned int DA_Value);void LCD_init(void);void LCD_init_first(void);void LCD_en_write1( void); /上升沿使能void LCD_en_write2(void); /下降沿使能void LCD_write_command(unsigned char command);void LCD
37、_write_data(unsigned char data);void LCD_set_xy (unsigned char x, unsigned char y);void LCD_write_string(unsigned char X,unsigned char Y, unsigned char *s);void LCD_write_char(unsigned char X,unsigned char Y, unsigned char data);void Disp_float(float f_data);void delay_1ms(void);void delay_nus(unsig
38、ned int n);void delay_nms(unsigned int n);void ADC_convert();unsigned char LCDBuf1="The current is: "unsigned int h,i,j,k,l,m,n,o,p;float temp,c,v,r,z;void main()WDTCTL = WDTPW + WDTHOLD;/ 关闭看门狗LCD_init_first();LCD_init();/key_int();delay_nms(100);while(1)float DAValue=0; DAValue=zh(aa);/定义输出的电压,电路中的电流,初始值 DA_conver(DAValue); delay_nms(10);P1SEL|=0x20;/使能ADC通道A5 ADC10CTL1|=INCH_5+ADC10DIV_1+CONSEQ_2; ADC1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论