
---------------------------------------------------
IDE: TI CCS 20.3.0
--------------------------------------------------程式碼
#include <msp430.h>
#include <stdint.h>
//================================Define區=============================
//ADC Part
//================================變數區================================
//ADC Part
volatile uint16_t adc_values[3]; // [0]=A2(P1.2), [1]=A3(P1.3), [2]=A5(P1.5)
//================================函式區=================================
//ADC Part
// 初始化 ADC(Vref=AVCC,時脈=SMCLK,10-bit,採樣定時器)
void adc_init_fr2311(void)
{
PM5CTL0 &= ~LOCKLPM5; // 解除高阻態
// 設定 A2/P1.2, A3/P1.3, A5/P1.5 為 ADC 輸入
P1SEL0 |= (BIT2 | BIT3 | BIT5);
P1SEL1 |= (BIT2 | BIT3 | BIT5);
ADCCTL0 = ADCSHT_3 | ADCON; // 取樣保持時間長一點、開啟 ADC
ADCCTL1 = ADCSHP | ADCSSEL_2 | ADCDIV_3; // SMCLK/8 作為 ADC clock
#ifndef ADCRES_1
#define ADCRES_1 ADCRES
#endif
ADCCTL2 = ADCRES_1; // 10-bit 解析度
}
// 讀單一通道(ch 3/4/5),回傳 0~1023
static inline uint16_t adc_read_ch(uint8_t ch)
{
ADCCTL0 &= ~ADCENC; // 先 disable ENC 才能設定 channel
ADCMCTL0 = (ch << 0) | ADCSREF_0; // 設定 channel,參考為 AVCC/AVSS
// dummy sample 丟棄第一次(確保準確)
ADCCTL0 |= ADCENC | ADCSC;
while (ADCCTL1 & ADCBUSY);
(void)ADCMEM0;
__delay_cycles(50); // 充電時間,視阻抗調整
// 正式 sample
ADCCTL0 |= ADCENC | ADCSC;
uint16_t timeout = 0xFFFF;
while ((ADCCTL1 & ADCBUSY) && --timeout);
return ADCMEM0;
}
// 一次讀三個通道:P1.2→P1.3-P1.5
void adc_read_triplet(void)
{
adc_values[0] = adc_read_ch(2); // A2 P1.2
adc_values[1] = adc_read_ch(3); // A4 P1.3
adc_values[2] = adc_read_ch(5); // A5 P1.5
}
//================================主程式=================================
int main(void)
{
WDTCTL = WDTPW | WDTHOLD;// Stop watchdog timer
PM5CTL0 &= ~LOCKLPM5; // 解除高阻態,讓 GPIO 可用(即使本例沒用到腳位,建議保留)
//ADC Init
adc_init_fr2311();
__enable_interrupt(); // 開啟中斷
while(1){
adc_read_triplet();
uint16_t value_p1_2 = adc_values[0];
uint16_t value_p1_3 = adc_values[1];
uint16_t value_p1_5 = adc_values[2];
__no_operation();
}
}
此範例設定了三個讀取ADC的腳位P1.2 P1.3 P1.5
驗證
簡單初步驗證
方法1:將開發版的3.3V腳位 灌到任一隻腳位,
如下圖(灌進P1.2),
這邊要注意若是這樣P1.3 P1.5 腳位要接地,
不然會有怪怪的值。
[0] : 為P1.2量測到的數值。(3.3V大約是1023~1025)
[1] : 為P1.3量測到的數值。
[2] : 為P1.5量測到的數值。

其它腳位有接地
下圖為P1.3 P1.5 未接地

其它腳位未接地
方法2:若開發環境有直流電源供應器就直接輸入0~3.3V,
觀察斷點adc_value的變化,應該是要有線性的特性。












