打印
[其它应用]

主循环不断地读取ADC值并进行处理(简单场景适用代码分享)

[复制链接]
800|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SHOPQQ|  楼主 | 2023-8-23 16:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机中读取模拟信号的AD值,而不使用ADC中断时,可以采用轮询(polling)的方式读取AD值。以下是一个简单的C语言例程,用于在单片机上读取ADC的值:
#include <avr/io.h> // 根据你的MCU型号和编译器进行调整

void ADC_init() {
    // 配置ADC的参考电压、分频系数等
    ADMUX |= (1 << REFS0); // 使用AVCC作为参考电压
    ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // 选择128分频系数
    ADCSRA |= (1 << ADEN); // 使能ADC
}

uint16_t ADC_read(uint8_t channel) {
    // 选择ADC通道
    ADMUX = (ADMUX & 0xF8) | (channel & 0x07);
   
    // 启动转换
    ADCSRA |= (1 << ADSC);
   
    // 等待转换完成
    while (ADCSRA & (1 << ADSC));
   
    // 读取ADC值
    uint16_t adc_value = ADC;
   
    return adc_value;
}

int main(void) {
    // 初始化ADC
    ADC_init();
   
    // 设置ADC通道(根据你的需求设置通道号)
    uint8_t adc_channel = 0;
   
    // 主循环
    while (1) {
        // 读取ADC值
        uint16_t adc_value = ADC_read(adc_channel);
        
        // 在这里可以对读取到的ADC值进行处理
        // 例如:将ADC值输出到串口、进行某种判断等
        
        // 延时或其他操作
    }
}
上述代码使用了AVR系列的MCU作为示例,需要根据你所使用的MCU型号和编译器进行适当的调整。

此外,ADC通道的选择(adc_channel)和其他设置应根据你的实际需求进行修改。

在这个例程中,主要的函数是ADC_init() 用于初始化ADC,以及 ADC_read() 用于读取指定通道的ADC值。
循环不断地读取ADC值并进行处理。这种轮询方式适用于简单的应用场景,但不适用于要求更高实时性或需要同时处理多个任务的情况。

使用特权

评论回复
沙发
dd5yit| | 2023-8-27 12:04 | 只看该作者
bqyj 发表于 2023-8-24 21:48
只能用于简单的应用场景啊

复杂的拿出来也不实用啊。轮询不挺常用的嘛?

使用特权

评论回复
板凳
狗啃模拟| | 2023-8-28 22:54 | 只看该作者
高实时性确实需要优化,不过这个很常用;

使用特权

评论回复
地板
szt1993| | 2023-9-28 14:57 | 只看该作者
单片机中采用轮询(polling)的方式读取AD值速率会慢吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

183

帖子

0

粉丝