高频高压电源的控制实验.docx
《高频高压电源的控制实验.docx》由会员分享,可在线阅读,更多相关《高频高压电源的控制实验.docx(23页珍藏版)》请在冰豆网上搜索。
![高频高压电源的控制实验.docx](https://file1.bdocx.com/fileroot1/2023-2/5/0f3f1a62-c370-4b60-b3ab-57ed798c11dd/0f3f1a62-c370-4b60-b3ab-57ed798c11dd1.gif)
高频高压电源的控制实验
高频高压电源的控制程序
/*******************************************************
高频高压电源的控制实验
功能:
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