ADC实验:
实验内容:
编写ADC程序,通过FS6818开发板上的电位器,改变ADC通道输入的电压值,经过ADC转换的值打印到终端。
实验目的:
熟悉开发环境;掌握s5p6818处理器ADC模块的使用和编程。
实验平台:
FS_6818开发平台,Ubuntu,secureCRT。
ADC:模数转换器:将模拟信号转换为数字信号的一个器件。
eg1: 模拟电压值0-1.8V ,转为8位的数字量
0 -----》0000 0000 0
1.8V---》1111 1111 255
将1.8平均分成256份,测量的数字量乘以一份的值,就是实际的模拟值。
eg2: 模拟电压值0-1.8V ,转为12位的数字量
0 -----》0000 0000 0000 0
1.8V---》1111 1111 1111 4095
将1.8平均分成4096份,测量的数字量乘以一份的值,就是实际的模拟值。
ADC转换为数字量位数越大,转换的精度越高。
- 分析电路图
- 分析芯片手册
会看视频的7月10日下午第二节课:15:5
编程流程图如下:
- 编写代码
main.c
#include "led.h"
#include "pwm.h"
#include "delay.h"
#include "uart0.h"
#include "wdt.h"
#include "adc.h"
int main()
{
hal_led_init();
// hal_pwm_init();
hal_uart_init();
hal_wdt_init();
hal_adc_init();
Tri_String("ADC Test\n");
while(1)
{
// 喂狗或不喂狗
WTCNT = 4687 * 10;
// ADC
printf("adc value = %d\n", get_adc_value());
delay_ms(100);
// Tri_Byte(Recv_Byte()+1);
// printf("pwm test!\n");
// led_flash(500);
// hal_pwm_switch(299, 149, ON);
// delay_ms(1000);
// hal_pwm_switch(299, 149, OFF);
// delay_ms(1000);
}
return 0;
}
adc.c
#include "adc.h"
void hal_adc_init(void)
{
// 4.9.4.2 IP_RESET_REFISTER0/1/2
unsigned int *ip_reset1 = (unsigned int *)0xC0012004;
*ip_reset1 = *ip_reset1 & (~(0x1 << 28));
*ip_reset1 = *ip_reset1 | (0x1 << 28);
//1.设置读取转换结果的延时时间 ADCCON[13:10] = 0b0000
ADCCON &= (~(0xF << 10));
//2.开启电源源之后,延时几个周期可以开启ADC转换
//a)ADCCON[9:6] =ADCCON 0x6
ADCCON &= (~(0xF << 6));
ADCCON |= (0x6 << 6);
//3.ADC输入的通道选择 ADCCON[5:3] = 0b00
ADCCON &= (~(0x7 << 3));
//4.开启ADC的电源 ADCCON[2] = 0b0
ADCCON &= (~(1 << 2));
//5.设置ADC的分频值 PRESCALERCON[9:0] = 199
PRESCALERCON &= (~(0x3FF));
PRESCALERCON |= (199);
//6.设置ADC的分频使能位 PRESCALERCON[15] = 0b1
PRESCALERCON |= (1 << 15);
}
int get_adc_value(void)
{
int value = 0;
// 1.开启ADC转换 ADCCON[0] = 0b1
ADCCON |= 1;
// 2.判断ADC转换是否结束 读ADCCON[0]是否为0,
//a)如果没有转换结束,如果没有转换结束在此等待DC转换结束,
while(ADCCON & 1); // 重点理解
// 3.读取ADC的转换结果 ADCDAT[11:0]
// 4.将数字量的结果通过公式转换为模拟量
// value = ADCDATAT * 1800 / 4095 * 2; 单位mv
value = ADCDAT & 0xFFF;
value = value * 1800 / 4095 * 2;
return value;
}
adc.h
#ifndef __ADC_H__
#define __ADC_H__
#include "s5p6818.h"
void hal_adc_init(void);
int get_adc_value(void);
#endif //__ADC_H__