?? ad(用ta).c
字號:
#include <msp430x14x.h>
unsigned int ADvalue;
void InitSys();
void ADC12Init();
void TimerAInit();
void delay();
void PWM(unsigned int zhankongbi);
void main()
{
WDTCTL=WDTPW+WDTHOLD;
InitSys();
P2DIR|=BIT7;//采樣指示燈
P4DIR|=BIT0;//該口用于控制電機轉向
ADC12Init();
TimerAInit();
_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>=2300)
{
ADvalue=ADC12MEM0-2300;//經測量發現,ADC12MEM0采樣的最大值為3900
if(ADC12MEM0<=3300)
ADvalue=0.2*ADvalue;//在改范圍內脈沖緩慢變化
else if(ADC12MEM0>3300)
ADvalue=2.333*ADvalue-2133;
P4OUT|=BIT0;//電機正轉
}
else if(ADC12MEM0>1700&&ADC12MEM0<2300)
ADvalue=0;
else
{
ADvalue=1700-ADC12MEM0;
if(ADvalue<=1000)
ADvalue=0.2*ADvalue;
else
ADvalue=2.143*ADvalue-1943;
P4OUT&=~BIT0;//電機反轉
}
PWM(ADvalue);
delay();
ADC12CTL0|=ADC12SC;//開始新一輪轉換
default:break;
}
}
void TimerAInit()
{
P1SEL|=BIT2;//P1.2為外圍模塊功能(TA1).
P1DIR|=BIT2;//P1.2用以輸出PWM信號;
TACTL=TASSEL_2+TACLR+MC_1+ID_0; //時鐘源為SMCLK,增計數模式
CCTL1=OUTMOD_7;//工作在PWM復位/置位模式(TAR的置等于CCR0時置位)
}
void PWM(unsigned int zhankongbi)
{
CCR1=zhankongbi;
CCR0=1500;
}
void delay()
{
unsigned int i;
for(i=0;i<=450;i++);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -