目前共有5篇帖子。 內容轉換:不轉換▼
 
點擊 回復
493 4
【程序】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转换。

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:493 回複數:4
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2017-3-6 23:07
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。