📄 ad转换(用tb).c
字号:
#include <msp430x14x.h>
unsigned int ADvalue;
void InitSys();
void ADC12Init();
void TimerBInit();
void delay();
void PWM(unsigned int zhankongbi);
void main()
{
WDTCTL=WDTPW+WDTHOLD;
InitSys();
P2DIR|=BIT7;
P2OUT|=BIT7;
ADC12Init();
TimerBInit();
_EINT();
ADC12CTL0|=ADC12SC;//启动第一次AD转换
while(1);
}
void ADC12Init()
{
ADC12CTL0&=~ENC;//在改变设置前停止AD转换。以下对寄存器各位的设置只用在ENC=0时才能被修改。
ADC12CTL0 = ADC12ON + REFON + REF2_5V + SHT0_6 ;//打开ADC内核,可以进行转换;无溢出中断
ADC12CTL1=CONSEQ_0+SHP+ADC12SSEL_2;//单通道单次转换,采样定时器输出为采样信号。选择时钟源为MCLK(8M)
ADC12MCTL0=0X00;//ADC12MCTL0的输入通道为A0
ADC12IE|=BIT0;//A0转换结束允许中断
ADC12CTL0|=ENC;//转换允许
P6SEL|=BIT0;//P6.0为外围模块功能(A0).
P6DIR&=~BIT0;
}
void InitSys()
{
unsigned int i;
BCSCTL1&=~XT2OFF;//打开XT2振荡器
do
{
IFG1&=~OFIFG;//清除XT2振荡器失效标志
for(i=0XFF;i>0;i--);//延时,等待XT2起振
}while((IFG1&OFIFG)!=0);//判断XT2是否起振
BCSCTL2=SELM_2+SELS;//选择MCLK、SMCLK为XT2
}
#pragma vector=ADC12_VECTOR
__interrupt void ADC (void)
{
P2OUT^=BIT7;
switch(ADC12IV)
{
case 0x02:break;
case 0x04:break;//溢出中断
case 0x06://通道A0转换完成
if(ADC12MEM0>=2200)
{
ADvalue=ADC12MEM0-2048;
P4OUT|=BIT0;
}
if(ADC12MEM0>1800&&ADC12MEM0<2200)
ADvalue=0;
else if(ADC12MEM0<1800)
{
ADvalue=2048-ADC12MEM0;
P4OUT&=~BIT0;
}
PWM(ADvalue);
delay();
ADC12CTL0|=ADC12SC;//开始新一轮转换
default:break;
}
}
void TimerBInit()
{
P4SEL|=BIT1;//P4.1为外围模块功能(TB1).
P4DIR|=0x03;//P4.1用以输出PWM信号,P4.0用以控制电机正反转;
TBCTL=TBSSEL_2+TBCLR+MC_1; //+ID_1时钟源为SMCLK,增计数模式
TBCCTL1=OUTMOD_7;//工作在PWM复位/置位模式(TAR的置等于CCR0时置位)
}
void PWM(unsigned int zhankongbi)
{
TBCCR1=zhankongbi;
TBCCR0=2048;
}
void delay()
{
unsigned int i;
for(i=0;i<=450;i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -