⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad(控制2电机).c

📁 移动机器人摇杆手柄调速中(AD采集)
💻 C
字号:
#include <msp430x14x.h>
unsigned int ADvalue;
void InitSys();
void ADC12Init();
void TimerAInit();
void delay();
void PWM1(unsigned int zhankongbi);
void PWM2(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_2+SHP+ADC12SSEL_2;//序列通道单次转换,采样定时器输出为采样信号。选择时钟源为MCLK(8M)
  ADC12MCTL0=0X00;//ADC12MCTL0的输入通道为A0
  ADC12MCTL1=0X01;//ADC12MCTL1的输入通道为A1
  ADC12IE|=BIT0+BIT1;//A0、A1转换结束允许中断
  ADC12CTL0|=ENC;//转换允许
  P6SEL=0x03;//P6.0、P6.1为外围模块功能(A0、A1).
  P6DIR=~0x03;//P6.0、P6.1口输入
}

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;
  //unsigned int i;
  //switch(ADC12IV)
  //{
 // case 0x02:break;
  //case 0x04:break;//溢出中断
  //case 0x06://通道A0     转换完成
   if(ADC12MEM1<1500||ADC12MEM1>2500)//在这个范围内通道A1数据有效
   {
                     //关闭通道A0
     if(ADC12MEM1<1500)
     {
       ADvalue=1500-ADC12MEM1;
       PWM1(ADvalue);
       PWM2(200);
     }
     else
     {
       ADvalue=ADC12MEM1-2500;
       PWM1(200);
       PWM2(ADvalue);
     }
     delay(); 
                   //打开通道A0
     ADC12CTL0|=ADC12SC;//开始新一轮转换
   }
   else //在其它范围内通道A0数据有效
   {
       if(ADC12MEM0>=2300)
       {
         ADvalue=ADC12MEM0-2300;//经测量发现,ADC12MEM0采样的最大值为3900
         if(ADC12MEM0<=3300)
           ADvalue=0.2*ADvalue;//在改范围内脉冲缓慢变化
         else
           ADvalue=2.333*ADvalue-2133;
         P4OUT|=BIT0;//电机正转
       }
       if(ADC12MEM0>1700&&ADC12MEM0<2300)
       {
         PWM1(0);
         PWM2(0);
       }
       else if(ADC12MEM0<=1700)
       {
         ADvalue=1700-ADC12MEM0;
         if(ADvalue<1000)
           ADvalue=0.2*ADvalue;
         else
           ADvalue=2.333*ADvalue-2133; 
         P4OUT&=~BIT0; //电机反转
       }
       PWM1(ADvalue);
       PWM2(ADvalue);
       delay();
       ADC12CTL0|=ADC12SC;//开始新一轮转换
   }
 // default:break;
 // }
}

void TimerAInit()
{
 P1SEL|=BIT2+BIT3;//P1.2为外围模块功能(TA1).
 P1DIR|=BIT2+BIT3;//P1.2用以输出PWM信号;
 TACTL=TASSEL_2+TACLR+MC_1+ID_0; //时钟源为SMCLK,连续计数模式
 CCTL1=OUTMOD_7;//工作在PWM复位/置位模式(TAR的置等于CCR0时置位)
 CCTL2=OUTMOD_7;
}

void PWM1(unsigned int zhankongbi)
{
  CCR1=zhankongbi;
  CCR0=1500;
}

void PWM2(unsigned int zhankongbi)
{
  CCR2=zhankongbi;
  CCR0=1500;
}

void delay()
{
  unsigned int i;
  for(i=0;i<=450;i++);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -