嵌入式入门10(ADC与触摸屏)

394 阅读1分钟

一、ADC工作原理

ADC数模转换器,顾名思义,能将模拟信号转换出数字信号。模拟信号最典型的例子就是可调电阻,欧姆定律。

由于数字信号是能被量化的,也就是用多少位进行表示,其最大值与模拟输入最大值成正比。

采样速度。

image.png

转换的数字信号最多用10位进行标识,每秒可完成500000次转换,支持电压转换0~3.3V。

image.png

image.png

  • ECFLG:表示A/D是否完成转换(只读)。
  • PRSCEN:使用A/D转换预分频器,设置为1。
  • PRSCVL:A/D转换预分频器值,设置为49。
  • SEL_MUX:模拟信号输入通道选择,设置为。
  • STDBM:休眠模式,设置为0。
  • READ_START:通过读操作,开启A/D转换。
  • ENABLE_START:只有在READ_START为Disable时才有效,设置1开始A/D转换,开始后需要清除该位。

image.png

ADCDLY:A/D转换开始延时,即开启A/D转换后,多久才开始正式的A/D转换。

我们用AIN0来测试A/D转换,而AIN0接在外部扩展插座上,我们需要手动焊接排插引脚。

image.png

adc.c

#include"../s3c2440_soc.h"

void adc_init(void)
{
    ADCCON = (1 << 14) | (49 << 6) | (000 << 3);
    ADCDLY = 0xff;
}

int adc_read_ain0(void)
{
    //启动ADC
    ADCCON |= (1 << 0);
    while (!(ADCCON & (1 << 15))); //等待ADC转换结束
    return ADCDAT0 & 0x3ff;
}

adc_test.c

#include "adc.h"

void adc_test(void)
{
    adc_init();

    while (1)
    {
        int val = adc_read_ain0();
        double vol = (double)val / 1023 * 3.3;
        int m = (int)vol;
        vol = vol - m;
        int n = vol * 1000;
        printf("vol:%d.%dV\r", m, n);
    }
}

blog.csdn.net/devintt/art…