設置 | 登錄 | 註冊

目前共有5篇帖子。

【程序】STM32通過AD轉換讀取PA6端口上輸入的模擬量並在1602液晶上顯示轉換結果

1樓 巨大八爪鱼 2017-3-6 22:36
#include <stdio.h>
#include <stm32f10x.h>

#define RS_0 (GPIOA->BRR = GPIO_BRR_BR0)
#define RS_1 (GPIOA->BSRR = GPIO_BSRR_BS0)
#define RW_0 (GPIOA->BRR = GPIO_BRR_BR1)
#define RW_1 (GPIOA->BSRR = GPIO_BSRR_BS1)
#define E_0 (GPIOA->BRR = GPIO_BRR_BR2)
#define E_1 (GPIOA->BSRR = GPIO_BSRR_BS2)

void delay(void)
{
    uint32_t i;
    for (i = 0; i < 8000000; i++);
}

void delay_short(void)
{
    uint8_t i;
    for (i = 0; i < 10; i++);
}

void LCD1602_BusyWait(void)
{
    RS_0;
    RW_1;
    E_1;
    GPIOC->CRL = 0x44444444; // 讀端口
    while (GPIOC->IDR & GPIO_IDR_IDR7);
    GPIOC->CRL = 0x33333333;
    E_0;
}

void LCD1602_WriteCmd(uint8_t cmd)
{
    LCD1602_BusyWait();
    RS_0;
    RW_0;
    GPIOC->ODR = cmd;
    E_1;
    delay_short();
    E_0;
}

void LCD1602_WriteData(uint8_t data)
{
    LCD1602_BusyWait();
    RS_1;
    RW_0;
    GPIOC->ODR = data;
    E_1;
    delay_short();
    E_0;
}

void LCD1602_Init(void)
{
    LCD1602_WriteCmd(0x38);
    LCD1602_WriteCmd(0x01);
    LCD1602_WriteCmd(0x0c);
    
    DAC->CR = DAC_CR_EN1 | DAC_CR_EN2;
    DAC->DHR8R1 = 69; // 對比度電壓: 約1.0V, 端口: PA4
    DAC->DHR8R2 = DAC->DHR8R1; // PA5輸出同樣大小的電壓
}

// printf內容往液晶上顯示
// 工程屬性里的Use MicroLIB必須打勾
int fputc(int ch, FILE *fp)
{
    LCD1602_WriteData(ch);
    return ch;
}

int main(void)
{
    uint8_t n = 0;
    RCC->APB1ENR = RCC_APB1ENR_DACEN;
    RCC->APB2ENR = RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_ADC1EN;
    
    GPIOA->CRL = 0x00000333; // RS, RW, E設為輸出, PA4~5為模擬輸出, PA6為模擬輸入
    GPIOC->CRL = 0x33333333; // 1602DATA
    
    LCD1602_Init();
    
    ADC1->SQR1 &= ~ADC_SQR1_L; // L=0000, 1 conversion
    ADC1->SQR3 = 6; // SQ1=PA6=ADC12_IN6
    ADC1->CR2 = ADC_CR2_ADON;
    while (1)
    {
        ADC1->CR2 |= ADC_CR2_ADON; // 再次寫1開始AD轉換
        while ((ADC1->SR & ADC_SR_EOC) == 0); // 等待轉換完畢
        LCD1602_WriteCmd(0x80); // 轉到第一行
        printf("ADC1->DR=%d    ", ADC1->DR);
        LCD1602_WriteCmd(0xc0); // 轉到第二行
        printf("n=%d  ", n++);
        delay();
    }
}
2樓 巨大八爪鱼 2017-3-6 22:39
ADC的轉換精度是12位,所以ADC1->DR的第16~13位始終為0,低12位為轉換結果。因此,轉換結果的取值範圍為0~4095。最高輸入電壓為3.3V(不可以輸入5V的電壓)。
3樓 巨大八爪鱼 2017-3-6 23:04
這裏要注意的是,如果PA6上的電位器的阻值很大,比如100kΩ,那麼其電壓值不能用普通的電壓表測量,因為普通的電壓表內阻只有幾千歐姆,測量的結果會非常不準確。
4樓 巨大八爪鱼 2017-3-6 23:06
對ADON再次寫1時,CR2寄存器的其他位必須保持不變,否則轉換不會啟動。
5樓 巨大八爪鱼 2017-3-6 23:07
ADON第一次置1時,ADC模塊上電,但不執行AD轉換。第二次寫1時,才進行AD轉換。

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。