IAR+STM8——ADC模數(shù)轉(zhuǎn)換器
掃描二維碼
隨時(shí)隨地手機(jī)看文章
今天有空來繼續(xù)寫學(xué)習(xí)筆記。STM8片上集成了10位逐次比較型模數(shù)轉(zhuǎn)換器,在開發(fā)板上有個(gè)電位器接到了AIN3,但沒有可以顯示數(shù)據(jù)的LED數(shù)碼管或LCD液晶顯示屏,怎么辦呢?通過前面的學(xué)習(xí),這個(gè)問題不難解決,在這里可以把AD采集數(shù)據(jù)通過UART發(fā)送到電腦上顯示。
#i nclude
void CLK_init(void)
{
CLK_CKDIVR = 0x08; // 16M內(nèi)部RC經(jīng)2分頻后系統(tǒng)時(shí)鐘為8M
}
void GPIO_init(void)
{
PD_DDR = 0x08; // 配置PD端口的方向寄存器PD3輸出
PD_CR1 = 0x08; // 設(shè)置PD3為推挽輸出
PD_CR2 = 0x80; // 使能PD7外部中斷
}
void EXTI_init(void)
{
EXTI_CR1 = 0x80; // PD口下降沿觸發(fā)中斷
}
#pragma vector=0x02
__interrupt void EXTI_PD7_TLI(void)
{
unsigned int value;
ADC_CSR &= ~0x80; // 清除EOC轉(zhuǎn)換結(jié)束標(biāo)志
ADC_CR1 |= 0x01; // 開始單次轉(zhuǎn)換
while(!(ADC_CSR&0x80)); // 等待單次轉(zhuǎn)換完成
value = ((int)ADC_DRH<<2); // 先讀高8位,默認(rèn)設(shè)置數(shù)據(jù)左對(duì)齊
value |= ADC_DRL; // 再讀低8位
while(!UART3_SR_TXE);
UART3_DR = value; // 通過UART3發(fā)送AD采樣結(jié)果
while(!UART3_SR_TXE);
UART3_DR = value>>8;
}
void ADC_init(void)
{
ADC_CSR = 0x03; // ADC輸入引腳AIN3
ADC_CR1 = 0x01; // ADC開啟
}
void UART3_init(void)
{
UART3_BRR2 = 0x01;
UART3_BRR1 = 0x34; // 8M/9600 = 0x341
UART3_CR2 = 0x0C; // 允許接收,允許發(fā)送
}
void init_devices(void)
{
asm("sim");
CLK_init();
GPIO_init();
EXTI_init();
ADC_init();
UART3_init();
asm("rim");
}
void main( void )
{
init_devices();
// 主循環(huán)里沒有程序需要執(zhí)行
while(1);
}
在本例中僅使用了ADC的單次轉(zhuǎn)換模式,每按一次按鍵進(jìn)行一次AD轉(zhuǎn)換,并把轉(zhuǎn)換結(jié)果通過UART發(fā)送,這樣可以在電腦上通過超級(jí)終端或串口調(diào)試軟件查看數(shù)據(jù)。
通過這次測(cè)試,還發(fā)現(xiàn)一個(gè)現(xiàn)象,如果把清除EOC轉(zhuǎn)換結(jié)束標(biāo)志放在讀取數(shù)據(jù)之后,那么在下次啟動(dòng)單次轉(zhuǎn)換后,EOC標(biāo)志位會(huì)自動(dòng)置位,此時(shí)必須人為的等待7us后才能讀到正確的數(shù)據(jù),否則只能讀到上一次的轉(zhuǎn)換數(shù)據(jù),可能這是STM8的ADC與其他MCU不同之處。