Chia sẻ Đọc ADC nhiều kênh dùng MSP430G2553

Tran luong

Trần Đình Lượng, Đt: 0989285187-HCM
#1
Thiết nghĩ các bạn có nhiều người đang cần cái này, do đó hôm nay tôi viết bài :
"Chia sẻ - Đọc ADC nhiều kênh dùng MSP430G2553",

mong rằng nó sẽ giúp ích được cho các bạn đang tìm hiểu nó. Rất mong nhận đơợc phản hồi từ phía các bạn. Chân thành cám ơn!

Sau đây là code viết trênIAR do chính tay tôi code; Đã có chú thích trong code các bạn theo dõi từ từ nhé. Cái nào không hiểu thì replay lên đây mình trả lời.

Mình có đính kèm Project bên dưới, bạn nào muốn chạy luôn thì tải về khỏi mất time tạo Project nhé
Lưu ý: IAR bản mới nhất mới mở được nhé các bạn! Các bạn Đao loát từ trang :
IAR Systems - Product Download

Chúc TC!
Mã:
   #include  "msp430g2553.h"
    int l=0;
    int  vr[4]; //Store adc values in this array
    void main()
    {
      WDTCTL = WDTPW + WDTHOLD;
      BCSCTL1 = CALBC1_1MHZ;
      DCOCTL = CALDCO_1MHZ;
 
      P1DIR|=0xF0;
 
      P2DIR=0XFF;
      P2SEL=0X00;
 
 
      ADC10CTL1 = INCH_3 + CONSEQ_3;            // A1/A0, repeat multi channel
      ADC10CTL0 = ADC10SHT_2 + MSC  + ADC10ON;
      ADC10AE0 = 0x0F;                          // P1.0,1 ADC option select
      ADC10DTC1 = 0x20;                         // 16 conversions
 
      TACTL|=TAIE;
      CCTL0 |= CCIE;                     // CCR0 interrupt enabled
      CCR0 = 50000;
      TACTL = TASSEL_2 + MC_1;        // SMCLK, upmode
   
      _BIS_SR( GIE);                 // Enter interrupt
      __delay_cycles(1000);
      while (1)
      {
           // Gia tri ADC doc theo ngat timer A1
         // Gia tri ADC cua 4 kenh tu P1.0 den P1.3 luu trong mang vr[]
        //P1.0 la vr[3]; P1.1 la vr[2]; P1.2 la vr[1]; ; P1.3 la vr[0];
        // Cac ban xu ly cac gia tri ADC o day toi vi du thoi nhe
        if(vr[2] > 255 ) // Neu gia tri ADC doc tu chan P1.1 < 255 <=> 255*3.3/1024 =  0.82177734375 V
          P1OUT |= BIT4;  // thi bat Led P1.4
        else            // Nguoc lai thi tat no di
           P1OUT &=~ BIT4;
     
      }
    }
    // Timer_A3 Interrupt Vector (TA0IV) handler
    #pragma vector=TIMER0_A1_VECTOR
    __interrupt void Timer0_A1(void)
    {
     switch( TA0IV )
     {
       case  2: break;                          // CCR1 not used
       case  4: break;                          // CCR2 not used
       case 10:
                l++;
                if(l==10)
                {
                l=0;
           
                ADC10CTL0 &= ~ENC;
                while (ADC10CTL1 & BUSY);      // Wait if ADC10 core is active
                ADC10SA = (unsigned int)vr;      // Data buffer start
                ADC10CTL0 |= ENC + ADC10SC;  // Sampling and conversion ready
                _NOP();                         // space for debugger
                _NOP();                         // space for debugger
                }
                break;
     }
    }
 

Đính kèm

Sửa lần cuối bởi điều hành viên:

chitrungns

Học sinh phổ thông
#2
anh có thể viết code đọc adc nhiều kênh với pic được không ạ? em đang rất cần mà trên mạng toàn có 1 kênh thôi anh ah!
 
#3
anh có thể viết code đọc adc nhiều kênh với pic được không ạ? em đang rất cần mà trên mạng toàn có 1 kênh thôi anh ah!
ví dụ 3 kênh hi:
#include <16F887.h>
#device ADC=10
#device *=16

#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=20000000)

int16 A,B,C;

void main()
{
setup_adc_ports(sAN0|sAN1|sAN2);
setup_adc(ADC_CLOCK_INTERNAL);

while(TRUE)
{
set_adc_channel( 0 );
delay_us(20);
A=read_adc();
delay_us(20);
set_adc_channel( 1 );
delay_us(20);
B=read_adc();
delay_us(20);
set_adc_channel( 2 );
delay_us(20);
C=read_adc();
}

}
Nhiều hơn bạn làm tương tự như thế.
Chúc vui :D
 

DoanhDoanh

Học sinh trung cấp
#4
Anh có thể giải thích rỏ cho em cái đoạn code phần Timer A3 được không vậy?
Cho em hỏi là em sau khi chuyển đổi ADC xong là lưu được vào trong mảng. Em so sánh cái giá trị đó với cái ngưỡng mà mình thiết lập, nếu nó lớn hơn ngưỡng của thì truyền dử liệu đó ra module CC1101 nhưng em không biết là mình có thể gởi được dử liệu trong mãng ra trực tiếp module được không?
Em cảm ơn!
 

huunho

Thạc sỹ
#5
Thiết nghĩ các bạn có nhiều người đang cần cái này, do đó hôm nay tôi viết bài :
"Chia sẻ - Đọc ADC nhiều kênh dùng MSP430G2553",

mong rằng nó sẽ giúp ích được cho các bạn đang tìm hiểu nó. Rất mong nhận đơợc phản hồi từ phía các bạn. Chân thành cám ơn!

Sau đây là code viết trênIAR do chính tay tôi code; Đã có chú thích trong code các bạn theo dõi từ từ nhé. Cái nào không hiểu thì replay lên đây mình trả lời.

Mình có đính kèm Project bên dưới, bạn nào muốn chạy luôn thì tải về khỏi mất time tạo Project nhé
Lưu ý: IAR bản mới nhất mới mở được nhé các bạn! Các bạn Đao loát từ trang :
IAR Systems - Product Download

Chúc TC!
Mã:
   #include  "msp430g2553.h"
    int l=0;
    int  vr[4]; //Store adc values in this array
    void main()
    {
      WDTCTL = WDTPW + WDTHOLD;
      BCSCTL1 = CALBC1_1MHZ;
      DCOCTL = CALDCO_1MHZ;
 
      P1DIR|=0xF0;
 
      P2DIR=0XFF;
      P2SEL=0X00;
 
 
      ADC10CTL1 = INCH_3 + CONSEQ_3;            // A1/A0, repeat multi channel
      ADC10CTL0 = ADC10SHT_2 + MSC  + ADC10ON;
      ADC10AE0 = 0x0F;                          // P1.0,1 ADC option select
      ADC10DTC1 = 0x20;                         // 16 conversions
 
      TACTL|=TAIE;
      CCTL0 |= CCIE;                     // CCR0 interrupt enabled
      CCR0 = 50000;
      TACTL = TASSEL_2 + MC_1;        // SMCLK, upmode
   
      _BIS_SR( GIE);                 // Enter interrupt
      __delay_cycles(1000);
      while (1)
      {
           // Gia tri ADC doc theo ngat timer A1
         // Gia tri ADC cua 4 kenh tu P1.0 den P1.3 luu trong mang vr[]
        //P1.0 la vr[3]; P1.1 la vr[2]; P1.2 la vr[1]; ; P1.3 la vr[0];
        // Cac ban xu ly cac gia tri ADC o day toi vi du thoi nhe
        if(vr[2] > 255 ) // Neu gia tri ADC doc tu chan P1.1 < 255 <=> 255*3.3/1024 =  0.82177734375 V
          P1OUT |= BIT4;  // thi bat Led P1.4
        else            // Nguoc lai thi tat no di
           P1OUT &=~ BIT4;
     
      }
    }
    // Timer_A3 Interrupt Vector (TA0IV) handler
    #pragma vector=TIMER0_A1_VECTOR
    __interrupt void Timer0_A1(void)
    {
     switch( TA0IV )
     {
       case  2: break;                          // CCR1 not used
       case  4: break;                          // CCR2 not used
       case 10:
                l++;
                if(l==10)
                {
                l=0;
           
                ADC10CTL0 &= ~ENC;
                while (ADC10CTL1 & BUSY);      // Wait if ADC10 core is active
                ADC10SA = (unsigned int)vr;      // Data buffer start
                ADC10CTL0 |= ENC + ADC10SC;  // Sampling and conversion ready
                _NOP();                         // space for debugger
                _NOP();                         // space for debugger
                }
                break;
     }
    }
code cua bạn có vấn đề ở chỗ số lần đọc ADC rất nhiều ADC10DTC1 = 0x20; trong khi mảng của bạn chỉ có 4 phần tử
 

Quảng cáo Google

Quảng cáo Google