MSP430F5529多通道采样的问题

2019-03-24 11:32发布

我编的一段两路的AD采集电压的程序,可是一直显示不对,求教是哪里的问题
  1. #include
  2. #include
  3. #include "msp430.h"
  4. #include "HAL_Dogs102x6.h"

  5. void lcd_int(void);
  6. void time_1_int(void);
  7. void display_time(void);
  8. void display_style(void);
  9. void button_init(void);
  10. void key_scan(void);
  11. void clock_check(void);
  12. void display_ADC(void);
  13. void ADC_init(void);


  14. char hour=0,min=0,sec=0;



  15. unsigned int  time_counter=0;

  16. volatile long temp;
  17. uint32_t sum1=0,com1,sum2=0,com2,flag=0;
  18. uint32_t tempData1[10];
  19. uint32_t tempData2[10];
  20. uint32_t cap,newdata,olddata,data;
  21. uint32_t num;

  22. uint8_t time_hour_style=0;
  23. uint8_t time_min_style=0;


  24. char time[] ="time: 00:00:00";

  25. char time_hour[]="00";
  26. char time_min[]="00";
  27. char time_sec[]="00";



  28. void main( void )
  29. {
  30.         WDTCTL = WDTPW + WDTHOLD;

  31.         time_1_int();
  32.         lcd_int();


  33.         button_init();
  34.         Dogs102x6_stringDraw(1,0,"==Battery power==", DOGS102x6_DRAW_NORMAL);
  35.         Dogs102x6_stringDraw(3,8,time,DOGS102x6_DRAW_NORMAL);         // write data to LCD
  36.         //Dogs102x6_stringDraw(3,0,clock,DOGS102x6_DRAW_NORMAL);        // write data to LCD
  37.         ADC_init();
  38.     P1DIR |= (0x01<<0);
  39.     P8DIR |= (0x01<<2);

  40.    while(1)
  41.     {
  42.             ADC12CTL0 |= ADC12SC;
  43.             display_ADC();
  44.                 display_time();
  45.                
  46.     }
  47. }

  48. void display_ADC(void)
  49. {
  50.         if(flag==1)
  51.                     {
  52.                                char string1[20];
  53.                                string1[0]=com1/1000+'0';
  54.                                string1[1]=46;
  55.                                string1[2]=com1/100%10+'0';
  56.                                string1[3]=com1/10%10+'0';
  57.                                string1[4]=com1%10+'0';
  58.                                string1[5]='';
  59.                                char string2[20];
  60.                                string2[0]=com2/1000+'0';
  61.                                string2[1]=46;
  62.                                string2[2]=com2/100%10+'0';
  63.                                string2[3]=com2/10%10+'0';
  64.                                string2[4]=com2%10+'0';
  65.                                string2[5]='';

  66.                                Dogs102x6_stringDraw(5, 8, "value1=", DOGS102x6_DRAW_NORMAL);
  67.                                Dogs102x6_stringDraw(5, 48, string1, DOGS102x6_DRAW_NORMAL);
  68.                                Dogs102x6_stringDraw(5, 78, "(V)", DOGS102x6_DRAW_NORMAL);
  69.                                Dogs102x6_stringDraw(6, 8, "value2=", DOGS102x6_DRAW_NORMAL);
  70.                                Dogs102x6_stringDraw(6, 48, string2, DOGS102x6_DRAW_NORMAL);
  71.                                Dogs102x6_stringDraw(6, 78, "(V)", DOGS102x6_DRAW_NORMAL);
  72.                     }
  73.        
  74. }

  75. void ADC_init(void)
  76. {
  77.           
  78.           ADC12CTL0 = ADC12ON+ADC12SHT0_8+ADC12MSC;
  79.           
  80.           ADC12CTL1 = ADC12SHP+ADC12CONSEQ_3;       // Use sampling timer,  sequence

  81.           ADC12MCTL0 = ADC12SREF_0+ADC12INCH_6;                 // ref+=AVcc, channel = A6
  82.           ADC12MCTL1 = ADC12SREF_0+ADC12INCH_7+ADC12EOS;       // ref+=AVcc, channel = A7

  83.                                                                  // Enable A/D channel inputs
  84.       P6SEL |=BIT6;
  85.       P6SEL |=BIT7;

  86.           ADC12IE = 0x02;                           // Enable ADC12IFG.1
  87.           //__delay_cycles(75);                       // 75us delay to allow Ref to settle
  88.           ADC12CTL0 |= ADC12ENC;                    // Enable conversions
  89. }


  90. void display_time(void)
  91. {
  92.         time_hour[0]=hour/10+'0';
  93.         time_hour[1]=hour%10+'0';
  94.         time_min[0]=min/10+'0';
  95.         time_min[1]=min%10+'0';
  96.         time_sec[0]=sec/10+'0';
  97.         time_sec[1]=sec%10+'0';

  98.        
  99.         Dogs102x6_stringDraw(3,44,time_hour,time_hour_style);
  100.         Dogs102x6_stringDraw(3,62,time_min,time_min_style);
  101.         Dogs102x6_stringDraw(3,80,time_sec,DOGS102x6_DRAW_NORMAL);
  102.        
  103. }

  104. void lcd_int(void)
  105. {
  106.         Board_init();                                              // GPIO initialization
  107.         Dogs102x6_init();                                          // initialize LCD
  108.         Dogs102x6_clearScreen();                                   // clear screen of LCD
  109.         Dogs102x6_backlightInit();                                 // initialize the backlight of LCD
  110.         Dogs102x6_setBacklight(20);                                // set up the backlight of LCD
  111.         __enable_interrupt();//enable globle interrupt
  112. }
  113. void time_1_int(void)
  114. {
  115.         TA1CCTL0 = CCIE;                          // CCR0 interrupt enabled
  116.         TA1CCR0 = 1045;                                                          //周期为1ms
  117.         TA1CTL = TASSEL_2 + MC_2 + TACLR;         // SMCLK ~= 1.045MHz, contmode, clear TAR
  118.         __enable_interrupt();//enable globle interrupt
  119. }
  120. void button_init(void)
  121. {
  122.         P1DIR &= ~(0x01<<7); //set P1.7 as input
  123.         P1REN |= (0x01<<7);  //enable resistor
  124.         P1OUT |= (0x01<<7);  //pull up

  125.         P2DIR &= ~(0x01<<2); //set P2.2 as input
  126.         P2REN |= (0x01<<2);  //enable resistor
  127.         P2OUT |= (0x01<<2);  //pull up
  128. }


  129. #pragma vector=TIMER1_A0_VECTOR
  130. __interrupt void TIMER1_A0_ISR(void)
  131. {
  132.         ++time_counter;
  133.         TA1CCR0 += 1045;
  134.         if (time_counter>=1000)
  135.         {
  136.                 time_counter = 0;
  137.             sec++;
  138.             //P1OUT ^= BIT0;
  139.             if(sec==60)
  140.             {
  141.                     sec=0;
  142.                     min++;
  143.                     if(min==60)
  144.                     {
  145.                             min=0;
  146.                             hour++;
  147.                             if(hour==24)
  148.                             {
  149.                                     hour=0;
  150.                             }
  151.                     }
  152.             }

  153.         }
  154. }
  155. #pragma vector=ADC12_VECTOR
  156. __interrupt void ADC12ISR (void)
  157. {
  158.         static unsigned int count = 0;
  159.     float factor=0.80566;//3300/4095
  160.     switch(__even_in_range(ADC12IV,34))
  161.   {
  162.   case  0: break;                           // Vector  0:  No interrupt
  163.   case  2: break;                           // Vector  2:  ADC overflow
  164.   case  4: break;                           // Vector  4:  ADC timing overflow
  165.   case  6: break;                           // Vector  6:  ADC12IFG0
  166.   case  8:                                      // Vector  8:  ADC12IFG1
  167.           tempData1[count] = ADC12MEM0;
  168.           tempData2[count] = ADC12MEM1;// Move results, IFG is cleared
  169.                                             // Move results, IFG is cleared

  170.                                       count++;
  171.                                       com1=tempData1[count];
  172.                                       //com1=com1*factor;
  173.                                       com2=tempData2[count];
  174.                                       //com2=com2*factor;
  175.                                         if (count == 12)
  176.                                               {
  177.                                                 count = 0;
  178.                                                 flag=1;
  179.                                                 ADC12IE = 0x00;
  180.                                               }
  181.                         // Move results, IFG is cleared
  182.            //   __bic_SR_register_on_exit(LPM4_bits);   // Exit active CPU
  183.               break;
  184.   case 10: break;                           // Vector 10:  ADC12IFG2
  185.   case 12:break;                            // Vector 12:  ADC12IFG3
  186.   case 14: break;                           // Vector 14:  ADC12IFG4
  187.   case 16: break;                           // Vector 16:  ADC12IFG5
  188.   case 18: break;                           // Vector 18:  ADC12IFG6
  189.   case 20: break;                           // Vector 20:  ADC12IFG7
  190.   case 22: break;                           // Vector 22:  ADC12IFG8
  191.   case 24: break;                           // Vector 24:  ADC12IFG9
  192.   case 26: break;                           // Vector 26:  ADC12IFG10
  193.   case 28: break;                           // Vector 28:  ADC12IFG11
  194.   case 30: break;                           // Vector 30:  ADC12IFG12
  195.   case 32: break;                           // Vector 32:  ADC12IFG13
  196.   case 34: break;                           // Vector 34:  ADC12IFG14
  197.   default: break;
  198.   }
  199. }

  200. #pragma vector=TIMER1_A1_VECTOR
  201. __interrupt void TIMER1_A1_ISR(void)
  202. {
  203.   switch(__even_in_range(TA1IV,14))
  204.   {
  205. case  0: break;                          // No interrupt
  206.   case  2:
  207.              if(TA1CCTL1&CM0)
  208.          {
  209.                newdata=TA1R;
  210.                if(newdata
  211.                {
  212.                        data=65536+newdata-olddata;
  213.                }
  214.                else
  215.                {
  216.                        data=newdata-olddata;
  217.                }
  218.                olddata=newdata;
  219.                num=data;
  220.          }
  221.                P1OUT ^= BIT3;
  222.                break;                                      // CCR1 not used
  223.     case  4: break;                                    // CCR2 not used
  224.     case  6: break;           // reserved
  225.     case  8: break;           // reserved
  226.     case 10: break;           // reserved
  227.     case 12: break;           // reserved
  228.     case 14: break;           // overflow
  229.     default: break;
  230.   }
  231. }

复制代码

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
shmily53
1楼-- · 2019-03-24 18:57
<

  1. #include <stdint.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "msp430.h"
  5. #include "HAL_UCS.h"
  6. #include "HAL_Board.h"
  7. #include "CTS_Layer.h"
  8. #include "HAL_AppUart.h"
  9. #include "ADC.h"

  10. unsigned int flag=0;
  11. volatile unsigned int A0results;
  12. volatile unsigned int A1results;
  13. volatile unsigned int A2results;
  14. volatile unsigned int A3results;

  15. void ADCInit()
  16. {
  17.   P6SEL |= BIT5 |BIT6| BIT7| BIT1;                       //使能ADC通道7
  18.   REFCTL0 &= ~REFMSTR;                                   //重置REFMSTR,交出控制权
  19.   ADC12CTL0 = ADC12ON+ADC12MSC+ADC12REFON+ADC12REF2_5V;  //打开ADC12采样时间,设置参考电压为2.5v
  20.   ADC12CTL1 = ADC12SHP|ADC12CONSEQ_3;                    //使用采样时钟
  21.   ADC12MCTL0 = ADC12SREF_1+ADC12INCH_1 ;                 //A1,V(R+) = VREF+ and V(R-) = AVSS, ADC12MCTL0转换结果存储寄存器
  22.   ADC12MCTL1= ADC12SREF_1+ADC12INCH_5 ;                  //A5,V(R+) = VREF+ and V(R-) = AVSS
  23.   ADC12MCTL2 = ADC12SREF_1+ADC12INCH_6 ;                 //A6,V(R+) = VREF+ and V(R-) = AVSS
  24.   ADC12MCTL3= ADC12SREF_1+ADC12INCH_7+ADC12EOS ;         //A7,V(R+) = VREF+ and V(R-) = AVSS,结束码
  25.   for ( int i=0; i<0x30; i++);                           //延时,确保参考电压设置完成
  26. }
  27. void ADCStart()
  28. {
  29.   ADC12IE = 0x08;                                        //使能中断ADC12IFG.3
  30.   ADC12CTL0 |= ADC12ENC;                                 //使能转换
  31.   ADC12CTL0 |= ADC12SC;                                  //开始转换
  32. }

  33. unsigned int GetPMValue()
  34. {
  35.    while(flag==0);
  36.    flag=1;
  37.    return A2results;
  38. }
  39. unsigned int GetVBATValue()
  40. {
  41.    while(flag==0);
  42.    flag=1;
  43.    return A3results;
  44. }
  45. #pragma vector = ADC12_VECTOR
  46. __interrupt void ADC12_ISR(void)
  47. {

  48.   switch(__even_in_range(ADC12IV,34))
  49.   {
  50.   case  0: break;                           // Vector  0:  No interrupt
  51.   case  2: break;                           // Vector  2:  ADC overflow
  52.   case  4: break;                           // Vector  4:  ADC timing overflow
  53.   case  6: break;                           // Vector  6:  ADC12IFG0
  54.   case  8: break;                           // Vector  8:  ADC12IFG1
  55.   case 10: break;                           // Vector 10:  ADC12IFG2
  56.   case 12:                                  // Vector 12:  ADC12IFG3
  57.     A0results = ADC12MEM0;           // Move A0 results, IFG is cleared   
  58.     A1results= ADC12MEM1;           // Move A1 results, IFG is cleared
  59.     A2results= ADC12MEM2;           // Move A2 results, IFG is cleared   
  60.     A3results = ADC12MEM3;           // Move A3 results, IFG is cleared   
  61.     #ifdef DEBUG
  62.                if(A0results>500)
  63.                   printf("PM2.5 VALUE is %d ",A0results);
  64.     #endif
  65.   case 14: break;                           // Vector 14:  ADC12IFG4
  66.   case 16: break;                           // Vector 16:  ADC12IFG5
  67.   case 18: break;                           // Vector 18:  ADC12IFG6
  68.   case 20: break;                           // Vector 20:  ADC12IFG7
  69.   case 22: break;                           // Vector 22:  ADC12IFG8
  70.   case 24: break;                           // Vector 24:  ADC12IFG9
  71.   case 26: break;                           // Vector 26:  ADC12IFG10
  72.   case 28: break;                           // Vector 28:  ADC12IFG11
  73.   case 30: break;                           // Vector 30:  ADC12IFG12
  74.   case 32: break;                           // Vector 32:  ADC12IFG13
  75.   case 34: break;                           // Vector 34:  ADC12IFG14
  76.   default: break;
  77.   }  
  78.    
  79.   ADC12IE = 0x00;                           // Enable ADC12IFG.3
  80.   ADC12CTL0 &= ~(ADC12ENC);                    // Enable conversions
  81.   ADC12CTL0 &= ~(ADC12SC);                  
  82.   flag=1;
  83. }
复制代码
参考下上面代码吧
shudct
2楼-- · 2019-03-24 20:19
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章