高频高压电源的控制实验.docx

上传人:b****7 文档编号:9633034 上传时间:2023-02-05 格式:DOCX 页数:23 大小:20.62KB
下载 相关 举报
高频高压电源的控制实验.docx_第1页
第1页 / 共23页
高频高压电源的控制实验.docx_第2页
第2页 / 共23页
高频高压电源的控制实验.docx_第3页
第3页 / 共23页
高频高压电源的控制实验.docx_第4页
第4页 / 共23页
高频高压电源的控制实验.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

高频高压电源的控制实验.docx

《高频高压电源的控制实验.docx》由会员分享,可在线阅读,更多相关《高频高压电源的控制实验.docx(23页珍藏版)》请在冰豆网上搜索。

高频高压电源的控制实验.docx

高频高压电源的控制实验

高频高压电源的控制程序

/*******************************************************

高频高压电源的控制实验

功能:

1、选择P6.0-P6.2作为模拟量输入通道,分别输入3路模拟信号,分别是直流电压DCV、谐振电流LVI、高压电流HVI,通过芯片内部AD采样电路,进行转换;

2、从P5.6口输出一个谐振电流LVI过流报警信号,驱动蜂鸣器发声;

3、从P5.0-P5.3输出信号,通过TLV5620分别输出3路模拟信号,分别是直流电压设定DCVSET、谐振电流设定LVISET和高压电流过流设定HVISET;

4、从键盘上分别设定电源启动POWERON、电源停止POWEROFF、直流电压设定DCVSET、高压电流过流报警值设定HVISET、0-9十个数字按键、确认ENTER、返回ESC等按钮;

5、在数码管上分别显示直流电压DCV、谐振电流LVI数据、高压电流过流报警值HVI等运行数据;

6、在液晶显示器上,第一行:

分别显示直流电压DCVSET、谐振电流LVISET数据、高压电流过流报警值HVISET等设定数据的大小

第二行:

分别显示直流电压DCV、谐振电流LVI数据、高压电流过流报警值HVI等运行数据的大小。

*******************************************************/

#include"msp430x14x.h"

#defineuintunsignedint

#defineucharunsignedchar

#defineulongunsignedlong

#defineCS_HIGHP5OUT|=BIT0;

#defineCS_LOWP5OUT&=~BIT0;

#defineCLK_HIGHP5OUT|=BIT3;

#defineCLK_LOWP5OUT&=~BIT3;

#defineDATA_HIGHP5OUT|=BIT1;

#defineDATA_LOWP5OUT&=~BIT1;

#defineRS_HIGHP4OUT|=BIT0//指令数据选择信号

#defineRS_LOWP4OUT&=~BIT0

#defineRW_HIGHP4OUT|=BIT1//读写信号

#defineRW_LOWP4OUT&=~BIT1

#defineE_HIGHP4OUT|=BIT2//使能信号

#defineE_LOWP4OUT&=~BIT2

#defineBUSY_OUTP2DIR|=BIT7

#defineBUSY_INP2DIR&=~BIT7

#defineBUSY_DATAP2IN&BIT7

ucharData1[]={"DVLIHI"};//显示"DCV:

"的大小

ucharData2[]={"..."};//显示"LVI:

"的大小

ucharData4[]={"DVSTLISTHIST"};//显示"DCV:

"的大小

ucharData3[]={"POWERON"};

ucharKeyValue=0xFF;

uintDataNum=0;

uintKeyFlay=0;

uintKeySet=0;

ulongDCVOutput=0;//直流电压DCVDA转换输出设定值

ulongLVIOutput=0;//低压电流LVIDA转换输出设定值

ulongHVIOutput=0;//高压电流HVIDA转换输出设定值

ulongFRESet=50;//谐振频率预设值

ulongDCVSet=50;//直流电压预设值

ulongHVISet=50;//高压电流预设值

uintPOWEROn=0;//设置电源启动标志

uintPOWERSet=0;//设置电源参数设定

uintDisplayValue=0;//定义一个显示变量

//键值编码表

ucharKeyCode[16]={0x77,0x7B,0x7D,0x7E,//0,1,2,3

0xB7,0xBB,0xBD,0xBE,//4,5,6,7

0xD7,0xDB,0xDD,0xDE,//8,9,A,b

0xE7,0xEB,0xED,0xEE};//C,d,E,F

constcharSinData[360]={128,130,132,134,136,139,141,143,145,148,150,152,154,156,158,161,163,165,167,169,

171,173,175,178,180,182,184,186,188,190,192,193,195,197,199,201,203,205,206,208,210,211,213,215,216,218,220,221,223,224,226,227,228,230,231,232,234,235,236,237,238,239,241,242,243,244,244,245,246,247,248,249,249,250,251,251,252,252,253,253,254,254,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,254,253,253,252,252,251,251,250,249,249,248,247,246,245,244,244,243,242,241,239,238,237,236,235,234,232,231,230,228,227,226,224,223,221,220,218,216,215,213,211,210,208,206,205,203,201,199,197,195,193,191,190,188,186,184,182,180,178,175,173,171,169,167,165,163,161,158,156,154,152,150,148,145,143,141,139,136,134,132,130,127,125,123,121,119,116,114,112,110,107,105,103,101,99,97,94,92,90,88,86,84,82,80,77,75,73,71,69,67,65,63,62,60,58,56,54,52,50,49,47,45,44,42,40,39,37,35,34,32,31,29,28,27,25,24,23,21,20,19,18,17,16,14,13,12,11,11,10,9,8,7,6,6,5,4,4,3,3,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,3,3,4,4,5,6,6,7,8,9,10,11,11,12,13,14,16,17,18,19,20,21,23,24,25,27,28,29,31,32,34,35,37,39,40,42,44,45,47,49,50,52,54,56,58,60,62,64,65,67,69,71,73,75,77,80,82,84,86,88,90,92,94,97,99,101,103,105,107,110,112,114,116,119,121,123,125};

//共阳数码管编码表

ucharCode[18]={0xC0,0xF9,0xA4,0xB0,//0,1,2,3

0x99,0x92,0x82,0xF8,//4,5,6,7

0x80,0x90,0x88,0x83,//8,9,A,b

0xC6,0xA1,0x86,0x8E,//C,d,E,F

0xBF,0xFF};//-,全灭

ucharBit[12]={0,0,0,0,0,0,0,0,0,0,0,0};//数码管各位显示的数字

ucharBit1[12]={0,0,0,0,0,0,0,0,0,0,0,0};//数码管各位显示的数字

ucharKey=0;//存放按键的数值

ucharBitCode=0x80;//数码管位码初值

uintADCBuf0[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//保存采集到通道0的数据

uintADCBuf1[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//保存采集到通道1的数据

uintADCBuf2[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//保存采集到通道2的数据

ulongSum0=0;//20个数据0的和

ulongSum1=0;//20个数据1的和

ulongSum2=0;//20个数据2的和

ulongVBuf0=0;//电压扩大10000000的值0

ulongVBuf1=0;//电压扩大10000000的值1

ulongVBuf2=0;//电压扩大10000000的值2

ucharCount=0;

//时钟初始化函数

voidInitClock(void){

BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启LFXT1工作在低频模式ACLK不分频最高的标称频率

DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率

do{

IFG1&=~OFIFG;//清除振荡器失效标志

for(uinti=255;i>0;i--);

}while(IFG1&OFIFG);//判断XT2是否起振

BCSCTL2=SELM1+SELS;//MCLKSMCLK时钟源为TX2CLK不分频

}

//端口初始化函数

voidInitPort(void){

P1SEL=0x00;//P1口所有引脚设置为一般的IO口

P1DIR=0x0F;//P1.0P1.1P1.2P1.3设置为输出方向

P1OUT=0x00;//P1口先输出低电平

P1IE=0xF0;//P1.4P1.5P1.6P1.7中断允许

P1IES=0xF0;//P1.4P1.5P1.6P1.7下降沿触发中断

P2SEL=0x00;//P2口所有引脚设置为一般的IO口

P4SEL=0x00;//P4口所有引脚设置为一般的IO口

P2DIR=0xFF;//P2口所有引脚设置为输出方向

P4DIR=0xFF;//P4口所有引脚设置为输出方向

P2OUT=0x00;//P2口先输出低电平

P4OUT=0xFF;//P4口先输出低电平

P5SEL=0x00;//设置为一般的IO口

P5DIR|=BIT7;//P5.7设置为输出方向

P5OUT&=~BIT7;//P5.7输出低电平来使能74HC573来驱动数码管

P5SEL&=~BIT6;//P5.7设置为一般的IO口

P5DIR|=BIT6;//P5.7设置为输出方向

P5OUT&=~BIT6;//P5.6输出驱低电平,蜂鸣器不发声

P5SEL&=~BIT0;//P5.0设置为一般的IO口

P5DIR|=BIT0;//P5.0设置为输出方向

P5SEL&=~BIT1;//P5.1设置为一般的IO口

P5DIR|=BIT1;//P5.1设置为输出方向

P5SEL&=~BIT3;//P5.3设置为一般的IO口

P5DIR|=BIT3;//P5.3设置为输出方向

P5SEL&=~BIT2;//P5.2设置为一般的IO口

P5DIR|=BIT2;//P5.2设置为输出方向

CS_HIGH;//使TLV5620不被选通

}

//ms级延时子程序

voidDelayMs(uintms){

while(ms--){

for(uinti=0;i<800;i++);

}

}

//数码管扫描显示程序

voidDisplay(void){

for(uchari=0;i<8;i++){

P4OUT=BitCode;//输出位码

if(i==0|i==4){//输出段码,如果第三位显示小数点

P2OUT=Code[Bit[i]]&0x7F;

}else{

P2OUT=Code[Bit[i]];

}

BitCode>>=1;//位码右移一位

if(BitCode==0)BitCode=0x80;

DelayMs

(2);//延时1ms

P2OUT=0xFF;

}

}

//ADC12初始化

voidInitADC12(void){

P6SEL=0x0F;//P6.0-P6.3为模拟输入AD通道

ADC12CTL0=ADC12ON+MSC+SHT0_2+REF2_5V;//ENC设置为0从而修改ADC12寄存器

ADC12CTL1=SHP+CONSEQ_3;//起始地址ADCMEM0,采样脉冲由采样定时器产生,多通道多次转换,内部时钟源不分频DC12CTL0=ADC12ON+MSC+SHT0_2+SREF_2;//ADC12开,第一次SHI的上升沿触发采样时序,ADC12MEMO-7的采样保持时间为16个ADC12CLK,参考电压2.5V

ADC12MCTL0=INCH_0+SREF_2;//参考电压为VeREF+和AVss输入通道A0直流电压输入DCVIN

ADC12MCTL1=INCH_1+SREF_2;//参考电压为VeREF+和AVss输入通道A1谐振电流输入LVIIN

ADC12MCTL2=INCH_2+SREF_2+EOS;//参考电压为VeREF+和AVss输入通道A2,结束转换通道选择

//高压电流输入HVIIN

}

//计算电压值

voidGetV(void){

for(uchari=0;i<20;i++)

{

Sum0+=ADCBuf0[i];

Sum1+=ADCBuf1[i];

Sum2+=ADCBuf2[i];

}

VBuf0=Sum0/20.0*((2.5*10000000)/4095.0);//计算DCV并扩大10000000倍2.5为外部参考电压可用R4调节

Sum0=0;

VBuf1=Sum1/20.0*((2.5*10000000)/4095.0);//计算LVI并扩大10000000倍2.5为外部参考电压可用R4调节

Sum1=0;

VBuf2=Sum2/20.0*((2.5*10000000)/4095.0);//计算HVI并扩大10000000倍2.5为外部参考电压可用R4调节

Sum2=0;

//计算数码管各位要显示的数值

if(KeyFlay==1)

{

for(uchari=0;i<16;i++)

{//查找键值对应的数字

if(KeyValue==KeyCode[i])

{

Key=i;//显示键值对应的数字

break;

}

}

}

else

{

Bit[0]=VBuf0/10000000;

Bit[1]=VBuf0%10000000/1000000;

Bit[2]=VBuf0%1000000/100000;

Bit[3]=VBuf0%100000/10000;

Bit[4]=VBuf1/10000000;

Bit[5]=VBuf1%10000000/1000000;

Bit[6]=VBuf1%1000000/100000;

Bit[7]=VBuf1%100000/10000;

Bit[8]=VBuf2/10000000;

Bit[9]=VBuf2%10000000/1000000;

Bit[10]=VBuf2%1000000/100000;

Bit[11]=VBuf2%100000/10000;

}

DelayMs(20);

KeyFlay=0;

}

//DA转换程序

voidDAConvert(ucharData,ucharCommand)

{

Command<<=1;

for(uchari=0;i<3;i++)

{

if(Command&0x80)

{

DATA_HIGH;//P5OUT|=BIT1,DATA串行数据输入

}

else

{

DATA_LOW;//P5OUT&=~BIT1,DATA串行数据输入

}

CLK_HIGH;//P5OUT|=BIT3,CLK串行接口时钟

Command<<=1;

CLK_LOW;//P5OUT&=~BIT3,CLK串行接口时钟

}

for(uchari=0;i<8;i++)

{

if(Data&0x80)

{

DATA_HIGH;

}

else

{

DATA_LOW;

}

CLK_HIGH;

Data<<=1;

CLK_LOW;

}

CS_LOW;//P5OUT&=~BIT0,LOAD载入控制,下降沿启动DA转换

DelayMs

(1);

CS_HIGH;//P5OUT|=BIT0,LOAD载入控制

}

//定时器A初始化

voidInitTimerA(void){

TACTL=TASSEL1+ID1+ID0+MC0+TACLR;//选择1/8SMCLK增计数清除TAR

TACCTL0=CCIE;//CCR0中断允许比较模式

TACCR0=60000;//时间间隔20ms20000

}

//按键分析程序

voidKeyProcess(void){

ucharOutData=0x07;

for(uchari=0;i<4;i++){//扫描4列

OutData|=0xF0;

P1OUT=OutData;

if(P1IN!

=OutData)KeyValue=P1IN;

OutData>>=1;

}

P1OUT=0x00;//恢复原来的值

}

//延时子函数

voidDelay(void){

for(uchari=255;i>0;i--);}

//端口1中断处理程序

#pragmavector=PORT1_VECTOR

__interruptvoidPort1INT(void)

{

KeyFlay=1;

Delay();

KeyProcess();

P1IFG=0x00;//清除中断标志位

}

//定时器A中断

#pragmavector=TIMERA0_VECTOR

__interruptvoidTimerAINT(void)

{

ADC12CTL0&=~ENC;

ADCBuf0[Count]=ADC12MEM0;

ADCBuf1[Count]=ADC12MEM1;

ADCBuf2[Count]=ADC12MEM2;

Count++;

if(Count==20)

{

GetV();

Count=0;

}

ADC12CTL0|=ENC+ADC12SC;//使能ADC转换

}

//测试LCD忙碌状态

voidLcdBusy(){

RS_LOW;

RW_HIGH;

E_HIGH;

_NOP();_NOP();

BUSY_IN;

while(BUSY_DATA);

BUSY_OUT;

E_LOW;

}

//写入指令到LCD

WriteCommand(ucharCommand){

LcdBusy();

RS_LOW;

RW_LOW;

E_HIGH;

_NOP();_NOP();

P2OUT=Command;

_NOP();_NOP();

E_LOW;

}

//写入字符数据到LCD

WriteData(ucharData){

LcdBusy();

RS_HIGH;

RW_LOW;

E_HIGH;

_NOP();_NOP();

P2OUT=Data;

_NOP();_NOP();

E_LOW;

}

//LCD初始化设定

LcdInit(){

WriteCommand(0x38);//8位数据端口,2行显示,5*7点阵

DelayMs(5);

WriteCommand(0x0c);//开启显示,无光标

DelayMs(5);

WriteCommand(0x06);//AC递增,画面不动

DelayMs(5);

WriteCommand(0x01);//清屏

DelayMs(5);

}

voidmain()

{

uchari;

WDTCTL=WDTPW+WDTHOLD;//关闭看门狗

InitClock();

InitPort();

InitTimerA();

LcdInit();//Lcd初始化

InitADC12();

_EINT();//打开中断

while

(1){

if(VBuf1>=20000000)

{

P5OUT|=BIT6;

DelayMs(5);

}

else

{

P5OUT&=~BIT6;

DelayMs(5);

}

//Display();//数码管显示DCV、LVI以及DCVSET、LVISET。

FRESET值

if(Key==9)//如果按键0按下,DCVLVIHVI参数设定按钮

{

POWERSet=1;

Key=15;

}

if(Key==1)//如果按键1按下,增加DCVSet的大小

{

if(POWERSet==1)

{

DCVSet=DCVSet+5;//DCVSET输出减小

DCVOutput=100+DCVSet;//计算DCVSet输出电压

if(DCVOutput>=255)

{

DCVOutput=255;//限制电源DCV的最大值

}

}

/*Bit[0]=1;

Bit[1]=0;

Bit[2]=0;

Bit[3]=0;*/

Bit1[0]=10000*DCVOutput/1000000;//Bit[4]=

Bit1[1]=10000*DCVOutput%1000000/100000;//Bit[5]=

Bit1[2]=10000*DCVOutput%100000/10000;//Bit[6]=

Bit1[3]=10000*DCVOutput%10000/1000;//Bit[7]=

Key=15;

}

if(Key==2)//如果按键2按下,减小DCVSet的大小

{

if(POWERSet==1)

{

DCVSet=DCVSet-5;//DCVSET输出增加

DCVOutput=100+DCVSet;//计算DCVSet输出电压

if(DCVOutput>=255)

{

DCVOutput=255;//限制电源DCV的最大值

}

/*Bit[0]=1;

Bit[1]=0;

Bit[2]=0;

Bit[3]=0;*/

Bit1[0]=10000*DCVOutput/1000000;//B

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1