基于MSP430单片机的交流电压测量设计
- 格式:doc
- 大小:65.50 KB
- 文档页数:7
基于MSP430单片机的交流电压测量设计
东南大学仪器科学与工程学院
许欢
摘要:在单片机的一些测量中,有时候需要我们直接测量交流信号,现介绍一种基于msp430 单片机实现的交流电压的测量方法。
关键字:MSP430单片机,交流电压,测量,中断
日常生活及学习中,我们一般需要之间测量交流信号,测量交流信号的方法有很多,而在应用单片机的测量中,我们常常用来测量直流电压,现在将介绍一种基于msp430单片机实现的交流电压的测量方法。
系统的构成主要分硬件设计和软件设计两块来介绍。
硬件设计:
为了保证硬件电路设计的通用性,采用单级性电压测量的方法,将输入的双极性电压转换成单级性电压进行测量。整个电路主要包括极性转换电路和输入处理电路。其中,极性转换电路主要由放大电路实现,在此我采用MCP601放大芯片。
MCP601芯片:(Microchip公司的一款高性能的放大芯片)
如图所示,该芯片共有8个管脚,
Vcc管脚:电源管脚
GND管脚:接地管脚
VIN-管脚:负输入端管脚
VIN+管脚:正输入端管脚
OUT管脚:输出管脚
极性转换电路设计:
在进行A/D转换时,我们一般会采用芯片的工作电压作为A/D转换的参考电压。由于一般芯片的工作电压都为正电压,而我们在这里要测量交流电压,所以要对输入的交流信号进行极性转换,将双极性变成单级性。下图为极性转换电路:
在极性转换电路中,ADOUT为输出信号。输出信号是在输入信号ADIN的基础上叠加了一个直流分量,调节上面的Vref的值就可以改变直流分量的值。如果调节Vref使直流分量的值为1.5V,并且此时输入信号是幅值为1.5V的交流正弦信号,那么输出信号就为最大值为3V,最小值为0V的单级性正弦信号。在极性转换电路基础上我们将很容易设计出我们要的输入电路。
输入处理电路:
在极性转换电路基础上,输入处理电路需要将220V的交流电压信号变为幅值为1.5V左右的交流信号,此外,还需要为MCP601提供适当的参考电压信号。电路如下图所示:
从所设计的电路中我们可以得到,首先通过变压器将220V的交流电压降成8V的交流电压,再经过极性转换电路将双极性的交流电压转换为单级性的交流电压。电路中的R405电位器主要用于调节参考电压,R404电位器用于调节交流输入电压的幅度。经过上面电路的处理,可以将输入的交流电压转换成0~3V的单级性交流电压,这样很容易使用MSP430单片机自带的A/D转换通道进行模拟量采集,从而实现交流电压的测量。
在上面的电路中,电压采用3V供电,电源芯片采用TPS76030,实现电路如下图所示:
单片机电路如下图所示:
整个电路如下图:
软件设计:
对于交流采集,需要在1个工频周期内采集40个点,即时间间隔为500us,时间间隔采用定时器实现。整个程序主要包括初始化程序和采集程序。
初始化程序主要是设置A/D采集通道和定时器A,采集程序主要是通过定时器来实现每间隔500us采集1次。采集程序使用定时器中断服务程序实现,在定时器中断里读出数据,当采集完40个点的数据后,设置一个标志通知主程序已经采集完40个点的数据,主程序通过全局的数据缓冲区与定时器中断服务程序实现数据的交互。
单片机程序设计:(根据TI公司所给软件的例程改编得到)
#include
char nADC_Flag;
int nADC_Count;
int ADC_BUF[40];
void Init_CLK(void);
void Init_ADC(void);
void Init_TimerA(void);
void Init_ADC(void)
{
//设置P6.0为模拟输入通道
P6SEL = 0X01;
//设置ENC为0,从而修改ADC12寄存器的值
ADC12CTL0 &= ~(ENC);
//设置参考电压分别为AVSS和A VCC,输入通道为A0 ADC12MCTL0 = INCH_0 + EOS;
//转换的起始地址为:ADCMEM0
ADC12CTL1 = 0X00;
ADC12CTL1 += CSTARTADD_0;
//采样脉冲由采用定时器产生
ADC12CTL1 += SHP;
//转换模式为:多通道、多次转换
ADC12CTL1 += CONSEQ_1;
//内部时钟源
ADC12CTL1 += ADC12SSEL_0;
//时钟分频为1
ADC12CTL1 += ADC12DIV_0;
ADC12CTL0 += 8 * 0x100;
ADC12CTL0 += MSC;
ADC12CTL0 += ADC12ON;
ADC12IE = 0;
//关闭各个通道的转换中断
ADC12IE |= 0X00;
//使能ADC转换
ADC12CTL0 |= ENC;
return;
}
void Init_TimerA(void)
{
// 选择SMCLK,清除TAR
TACTL = TASSEL1 + TACLR;
// 1/8 SMCLK
TACTL += ID1;
TACTL += ID0;
// CCR0 中断允许
CCTL0 = CCIE;
// 时间间隔为500us
CCR0 = 500;
// 增记数模式
TACTL |= MC0;
return;
}
void Init_CLK(void)
{