ADC模数转换电路的编程使用(S3C2440裸机开发)

文章目录

  • 前言
  • 一、ADC(模数转换电路)
  • 二、ADC的两种工作模式
  • 三、ADC电路的使用
  • 四、编程方法
  • 五、 ADC编程
    • 5.1 单次转换
    • 5.2 连续转换
    • 5.3 ADC中断
  • 总结


前言


一、ADC(模数转换电路)

功能: 能够将模拟信号转换成数字信号表示值的电路
ad比较重要的参数:

  1. 量程
  2. 位数 精度–》数字信号改变1对应多大的模拟信号变化
    精度=量程/2的位数次方
  3. 速率(转换速率)
  4. 误差
    2440的adc是内部电路;
    量程为0-3.3V,位数为10,转换速率最高位500k(工作在2.5M);

二、ADC的两种工作模式

1.单次转换:
(1)读转换:读一次转换一次(第一次的结果丢弃)
(2)start转换:一个start信号转换一次
2.连续转换

三、ADC电路的使用

S3C2440有板载的AD输入,原理图如下:
ADC模数转换电路的编程使用(S3C2440裸机开发)_第1张图片
ADC模数转换电路的编程使用(S3C2440裸机开发)_第2张图片
这里的AIN0引脚并非复用引脚,所以只需要使能ADC电路即可;

四、编程方法

  1. A/D 转换的数据可以通过中断或查询方式访问。中断方式的总体转换时间为从 A/D 转换器开始到转换数据的读取,可能由于中断服务程序的返回时间和数据访问时间而延迟。查询方式是通过检查转换结束标志位的 ADCCON[15],可以确定读取 ADCDAT 寄存器的时间。
  2. 还提供了其它启动 A/D 转换的方法。在转换的读启动模式 ADCCON[1]设置为 1 后,A/D 转换启动同时读取数据;
  3. ADC控制的相关寄存器如下:
    ADC模数转换电路的编程使用(S3C2440裸机开发)_第3张图片
    ADC模数转换电路的编程使用(S3C2440裸机开发)_第4张图片

五、 ADC编程

#include "adc.h"

void adc_init()
{
	ADCCON = (1<<14)|(19<<6);// 使能分频 0通道  start模式 (这里的两个或不能分开写),也设置了AIN0为输入通道
}

void adc_init_read()
{
	ADCCON = (1<<14)|(19<<6)|(1<<1);// 使能分频 0通道  read模式
}

void get_adc()
{
	int adc = -1;

	while (!(ADCCON & (1<<15)));	//等待有数据转换成功
	adc = ADCDAT0 & 0x3ff;
	uprintf("adc = %d\r\n", adc);
}
void start_read()
{
	int adc = -1;

	adc = ADCDAT0;	 //空转一次
}

void start()
{
	ADCCON |= 1;
}

5.1 单次转换

这里的start信号必须在循环内得到的转换数值才是动态变化的,放在循环外部数据时不变的;

void main(void)
{
	uart_init();
	uprintf("ni hao pc!\r\n");
	adc_init();
	while(1)
	{
		start();		//单次转换,所以start放在循环外面里面获取的adc数据是固定的
		get_adc();		//获取ADC转换数值
		delay();	
	}
}

5.2 连续转换

void main(void)
{
	uart_init();
	uprintf("ni hao pc!\r\n");
	adc_init_read();
	start_read();		 //读转换可以做到单次转换做到连续
	while(1)
	{
		get_adc();
		delay();		
	}
}

最终的转换结果为:
ADC模数转换电路的编程使用(S3C2440裸机开发)_第5张图片

5.3 ADC中断

ADC模数转换电路的编程使用(S3C2440裸机开发)_第6张图片

void adc_eint()
{
	ADCCON = (1<<14)|(19<<6);// 使能分频 0通道  start模式 (这里的两个或不能分开写)
	INTSUBMSK &= ~(1<<10);
	INTMSK &= ~(1<<31);
	
}


void do_adc()
{
	int adc = -1;
	while (!(ADCCON & (1<<15)));
	adc = ADCDAT0 & 0x3ff;
	uprintf("adc = %d\r\n", adc);
	SUBSRCPND |= 1<<10;
	SRCPND |= 1<<31;
	INTPND |= 1<<31;
}

总结

本期和大家主要分享的是ADC电路的基本原理以及ADC模数转换电路的编程使用,分为两种模式,单次转换和连续转换两种转换模式,单词转换需要用户自己每次手动进行转换,而连续转换,当数据转换完毕时,对应的标志位会置位,接下来可以对数据寄存器中的数据进行读取即可;最后,各位小伙伴们如果喜欢我的分享可以点赞收藏哦,你们的认可是我创作的动力,一起加油!

你可能感兴趣的:(ARM体系结构与接口技术,arm开发,linux,嵌入式硬件,ARM汇编,ADC)