智能车学习(三)—— ADC学习
一、代码分享:
1、ADC头文件
#ifndef ADC_H_
#define ADC_H_ #include "common.h"
typedef enum
{
// ---------------------------------ADC0-------------------------
ADC0_DP0 = 0, // PTE20
ADC0_SE0 = 0, ADC0_DP1 = 1, // PTE16
ADC0_SE1 = 1, ADC0_DP2 = 2, // PTE18
ADC0_SE2 = 2, ADC0_DP3 = 3, // PTE22
ADC0_SE3 = 3, ADC0_DM0 = 4, // PTE21
ADC0_SE4a= 4, ADC0_DM1 = 5, // PTE17
ADC0_SE5a= 5, ADC0_DM2 = 6, // PTE19
ADC0_SE6a= 6, ADC0_DM3 = 7, // PTE23
ADC0_SE7a= 7, ADC0_SE4b= 4, // PTE29 不支持软件ADC,传递进软件触发ADC,会当作 a通道处理 ADC0_SE5b= 5, // PTD1 不支持软件ADC,传递进软件触发ADC,会当作 a通道处理 ADC0_SE6b= 6, // PTD5 不支持软件ADC,传递进软件触发ADC,会当作 a通道处理 ADC0_SE7b= 7, // PTD6 不支持软件ADC,传递进软件触发ADC,会当作 a通道处理 ADC0_SE8, // PTB0 ADC0_SE9, // PTB1 ADC0_RES0, // 保留 ADC0_SE11, // PTC2 ADC0_SE12, // PTB2 ADC0_SE13, // PTB3 ADC0_SE14, // PTC0 ADC0_SE15, // PTC1 ADC0_RES1, // 保留 ADC0_RES2, // 保留 ADC0_RES3, // 保留 ADC0_RES4, // 保留 ADC0_RES5, // 保留 ADC0_RES6, // 保留 ADC0_RES7, // 保留 ADC0_SE23, // PTE30 DAC0_OUT = ADC0_SE23, // PTE30 DAC0输出 ,传入 ADC函数会当作 ADC0_SE23 处理 ADC0_RES8, // 保留 ADC0_RES9, // 保留 Temp0_Sensor, // Temperature Sensor,内部温度测量,可用ADC函数
Bandgap0, // 温度补偿结构带隙基准源 不支持ADC
ADC0_RES10, // 保留
VREFH0, // 参考高电压,可用ADC函数 ,结果恒为 2^n-1
VREFL0, // 参考低电压,可用ADC函数 ,结果恒为 0
Module0_Dis, // 不支持 ADC } ADCn_Ch_e; typedef enum //ADC模块
{
ADC0,
ADC1
} ADCn_e; //精度位数
typedef enum ADC_nbit
{
ADC_8bit = 0x00,
ADC_10bit = 0x02,
ADC_12bit = 0x01,
ADC_16bit = 0x03
} ADC_nbit; enum HardwareAverage
{
sample4 = 0,
sample8 = 1,
sample16 = 2,
sample32 = 3,
}; //外部函数接口声明 extern void adc_init (ADCn_Ch_e); //ADC初始化
extern uint16_t adc_once (ADCn_Ch_e, ADC_nbit); //采集一次一路模拟量的AD值
extern uint16_t ad_ave(ADCn_Ch_e adcn_ch, ADC_nbit bit, uint8_t N); //均值滤波 extern void adc_stop (ADCn_e); //停止ADC转换 #endif
2、ADC主文件
#include "adc.h"
ADC_MemMapPtr ADCN[1] = {ADC0_BASE_PTR}; //定义一个指针数组保存 ADCN 的地址
void adc_start(ADCn_Ch_e adcn_ch, ADC_nbit bit) ;
/*!
* @brief ADC初始化
* @param ADCn_Ch_e ADC通道
* @since v5.0
* @note 此初始化仅支持软件触发,不是每个通道都支持ADC 软件触发,
具体说明见 ADCn_Ch_e 的注释说明
* Sample usage: adc_init (ADC0_SE10 ); //初始化 ADC0_SE10 ,使用 PTA7 管脚
*/
void adc_init(ADCn_Ch_e adcn_ch)
{
uint8_t adcn = adcn_ch >> 5 ;
//uint8_t ch = adcn_ch & 0x1F;
//ADC_MemMapPtr adc_ptr = ADCN[adcn];
switch(adcn)
{
case ADC0: /* ADC0 */
SIM_SCGC6 |= (SIM_SCGC6_ADC0_MASK ); //开启ADC0时钟
SIM_SOPT7 &= ~(SIM_SOPT7_ADC0ALTTRGEN_MASK | SIM_SOPT7_ADC0PRETRGSEL_MASK);
SIM_SOPT7 |= SIM_SOPT7_ADC0TRGSEL(0);
break;
default:
ASSERT(0);
}
switch(adcn_ch)
{
case ADC0_SE0:
port_init(PTE20, ALT0);
break;
case ADC0_SE1:
port_init(PTE16, ALT0);
break;
case ADC0_SE2:
port_init(PTE18, ALT0);
break;
case ADC0_SE3:
port_init(PTE22, ALT0);
break;
case ADC0_SE4a:
port_init(PTE21, ALT0);
break;
case ADC0_SE5a:
port_init(PTE17, ALT0);
break;
case ADC0_SE6a:
port_init(PTE19, ALT0);
break;
case ADC0_SE7a:
port_init(PTE23, ALT0);
break;
case ADC0_SE8:
port_init(PTB0, ALT0);
break;
case ADC0_SE9:
port_init(PTB1, ALT0);
break;
case ADC0_SE11:
port_init(PTC2, ALT0);
break;
case ADC0_SE12:
port_init(PTB2, ALT0);
break;
case ADC0_SE13:
port_init(PTB3, ALT0);
break;
case ADC0_SE14:
port_init(PTC0, ALT0);
break;
case ADC0_SE15:
port_init(PTC1, ALT0);
break;
case ADC0_SE23:
port_init(PTE30, ALT0);
break;
case Temp0_Sensor: // Temperature Sensor,内部温度测量,可用ADC函数
break;
case VREFH0: // 参考高电压,可用ADC函数 ,结果恒为 2^n-1
break;
case VREFL0: // 参考低电压,可用ADC函数 ,结果恒为 0
break;
default:
ASSERT(0); //断言,传递的管脚不支持 ADC 单端软件触发,请换 其他管脚
break;
}
}
uint16_t adc_once(ADCn_Ch_e adcn_ch, ADC_nbit bit) //采集某路模拟量的AD值
{
ADCn_e adcn = (ADCn_e)(adcn_ch >> 5) ;
uint16_t result = 0;
adc_start(adcn_ch, bit); //启动ADC转换
while (( ADC_SC1_REG(ADCN[adcn], 0 ) & ADC_SC1_COCO_MASK ) != ADC_SC1_COCO_MASK); //只支持A通道
result = ADC_R_REG(ADCN[adcn], 0);
ADC_SC1_REG(ADCN[adcn], 0) &= ~ADC_SC1_COCO_MASK;
return result;
}
/*************************************************************************
* 野火嵌入式开发工作室
*
* 函数名称:ad_ave
* 功能说明:多次采样,取平均值
* 参数说明:ADCx 模块号( ADC0、 ADC1)
* ADC_Channel 通道号
* ADC_nbit 精度( ADC_8bit,ADC_12bit, ADC_10bit, ADC_16bit )
* N 均值滤波次数(范围:0~255)
* 函数返回:16位无符号结果值
* 修改时间:2012-2-10
* 备 注:修改苏州大学的例程
*************************************************************************/
uint16_t ad_ave(ADCn_Ch_e adcn_ch, ADC_nbit bit, uint8_t N) //均值滤波
{
uint32_t tmp = 0;
uint8_t i;
//ASSERT( ((adcn == ADC0) && (ch >= AD8 && ch <= AD18)) || ((adcn == ADC1) && (ch >= AD4a && ch <= AD17)) ) ; //使用断言检测ADCn_CHn是否正常
for(i = 0; i < N; i++)
tmp += adc_once(adcn_ch,bit);
tmp = tmp / N;
return (uint16_t)tmp;
}
/*!
* @brief 启动ADC软件采样(不支持B通道)
* @param ADCn_Ch_e ADC通道
* @param ADC_nbit ADC精度( ADC_8bit,ADC_12bit, ADC_10bit, ADC_16bit )
* @since v5.0
* @note 此函数内部调用,启动后即可等待数据采集完成
* Sample usage: adc_start(ADC0_SE10, ADC_8bit);
*/
void adc_start(ADCn_Ch_e adcn_ch, ADC_nbit bit)
{
ADCn_e adcn = (ADCn_e)(adcn_ch >> 5) ;
uint8_t ch = (uint8_t)(adcn_ch & 0x1F);
//初始化ADC默认配置
ADC_CFG1_REG(ADCN[adcn]) = (0
//| ADC_CFG1_ADLPC_MASK //ADC功耗配置,0为正常功耗,1为低功耗
| ADC_CFG1_ADIV(2) //时钟分频选择,分频系数为 2^n,2bit
| ADC_CFG1_ADLSMP_MASK //采样时间配置,0为短采样时间,1 为长采样时间
| ADC_CFG1_MODE(bit)
| ADC_CFG1_ADICLK(0) //0为总线时钟,1为总线时钟/2,2为交替时钟(ALTCLK),3为 异步时钟(ADACK)。
);
ADC_CFG2_REG(ADCN[adcn]) = (0
//| ADC_CFG2_MUXSEL_MASK //ADC复用选择,0为a通道,1为b通道。
//| ADC_CFG2_ADACKEN_MASK //异步时钟输出使能,0为禁止,1为使能。
| ADC_CFG2_ADHSC_MASK //高速配置,0为正常转换序列,1为高速转换序列
| ADC_CFG2_ADLSTS(0) //长采样时间选择,ADCK为4+n个额外循环,额外循环,0为20,1为12,2为6,3为2
);
//写入 SC1A 启动转换
ADC_SC1_REG(ADCN[adcn], 0 ) = (0
| ADC_SC1_AIEN_MASK // 转换完成中断,0为禁止,1为使能
//| ADC_SC1_DIFF_MASK // 差分模式使能,0为单端,1为差分
| ADC_SC1_ADCH( ch ) //输入通道选择位
);
//ADC_SC1_REG(ADCN[adcn], 1 ) = 0;
}
/*!
* @brief 停止ADC软件采样
* @param ADCn_e ADC模块号( ADC0、 ADC1)
* @since v5.0
* Sample usage: adc_stop(ADC0);
*/
void adc_stop(ADCn_e adcn)
{
ADC_SC1_REG(ADCN[adcn], 0) = (0
| ADC_SC1_AIEN_MASK // 转换完成中断,0为禁止,1为使能
//| ADC_SC1_DIFF_MASK // 差分模式使能,0为单端,1为差分
| ADC_SC1_ADCH(Module0_Dis) //输入通道选择,此处选择禁止通道
);
}
二、使用方法:
uint16_t t=0;
adc_init(ADC0_DP0); //ADC初始化 while(1)
{
t = adc_once(ADC0_DP0, ADC_16bit); //采集一次一路模拟量的AD值
}
智能车学习(三)—— ADC学习的更多相关文章
- java_web学习(三) eclipse_jsp学习
1.首先打开eclipse,新建一个Dynamac web project项目文件 2.在WebContent单击右键创建JSP File 3.过程 4.简单的jsp代码 运行结果: 5.导出war文 ...
- Html学习(三) 分类学习
代码: <h1>这是一级分类吗</h1> <h2>这是二级分类吗</h2> <h3>这是三级分类吗 </h3> 效果: 介绍: ...
- 智能车学习(十五)——K60野火2013版例程
一.中断函数注册方法: 1.格式: 配置某个功能的中断 注册中断函数 开启中断 2.一个例子 pit_init_ms(PIT0,);//定时中断初始化 set_vector_handler(PIT0_ ...
- 智能车学习(二)—— GPIO学习
一.概述 使用的是蓝宇的底层,主要有初始化管脚,设置管脚状态,反转管脚状态等. 二.代码重述: 1.头文件gpio.h #ifndef GPIO_H //防止重复定义(gpio_H 开头) #defi ...
- [ZZ] 深度学习三巨头之一来清华演讲了,你只需要知道这7点
深度学习三巨头之一来清华演讲了,你只需要知道这7点 http://wemedia.ifeng.com/10939074/wemedia.shtml Yann LeCun还提到了一项FAIR开发的,用于 ...
- 20175314 《Java程序设计》第三周学习总结
20175314 <Java程序设计>第三周学习总结 教材学习内容总结 编程语言的发展事是从面向机器(汇编.机器)到面向过程(C)再到面向对象(Java) 成员变量: 1.成员变量定义在类 ...
- (java)selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待
selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待 本例包括窗口最大化,刷新,切换到指定窗口,后退,前进,获取当前窗口url等操作: import java. ...
- HTTP学习三:HTTPS
HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...
- 20145213《Java程序设计》第三周学习总结
20145213<Java程序设计>第三周学习总结 教材学习内容总结 正所谓距离产生美,上周我还倾心于Java表面的基础语法.其简单的流程结构,屈指可数的基本类型分类,早已烂熟于心的运算符 ...
- 20145304 Java第三周学习报告
20145304 <Java程序设计>第三周学习总结 教材学习内容总结 1.定义类: 类定义时使用class关键词,建立实例要使用new关键词. 代码如下: /*定义类 书上例子 衣服的型 ...
随机推荐
- ios 音乐播放,音乐信息显示方法
下面的博客写的很清楚了 http://msching.github.io/blog/page/2/ 主要涉及AVAudioPlayer和下面这几个函数 MPNowPlayingInfoCenter.d ...
- sed小知识总结
1)sed默认是打印出文件中的所有行的,使用 -n 选项可以只打印出 匹配 的行 2)当用到sed不同的编辑命令时,用{},且不同编辑命令之间用分号
- HBase独立集群部署
HBase是分布式.面向列式存储的开源数据库,来源于Google的论文BigTable,HBase运行于Hadoop平台之上,不同于一般的关系数据库,是一个适合非结构化数据存储的分布式数据库 安装Hb ...
- metro中stream转IRandomAccessStream
下面的例子是从zip压缩文件解压出jpg文件流,再显示出来. StorageFile zip = await KnownFolders.PicturesLibrary.GetFileAsync(&qu ...
- 在Linux下记录所有用户的登录和操作日志
一般我们可以用history命令来查看用户的操作记录,但是这个命令不能记录是哪个用户登录操作的,也不能记录详细的操作时间,且不完整:所以误操作而造成重要的数据丢失,就很难查到是谁操作的. 在这里我们通 ...
- java基础学习05(面向对象基础01)
面向对象基础01 1.理解面向对象的概念 2.掌握类与对象的概念3.掌握类的封装性4.掌握类构造方法的使用 实现的目标 1.类与对象的关系.定义.使用 2.对象的创建格式,可以创建多个对象3.对象的内 ...
- Divide and conquer:K Best(POJ 3111)
挑选最美的珠宝 题目大意:挑选k个珠宝使得∑a/∑b最大,输出组合数 最大化平均值的标准题型,二分法就好了,一定要注意范围(10e-7),如果是10e-8就会tle,10e-6就是wa #inclu ...
- 【leetcode】 Palindrome Partitioniong (middle) (*^__^*)
Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...
- Delphi 2010 Can't load package C:\Programme\Afalinasoft\Add-in Express 2\d5units\adxwizardd5.bpl.
"Can't load package C:\Programme\Afalinasoft\Add-in Express 2\d5units\adxwizardd5.bpl. Componen ...
- cookie的设置、获取以及删除
首先介绍一下cookie的基本信息: cookie是以域为单位的,它必须放在服务器的的环境下,但是cookie的容量小,只有4kb,并且也不安全,还有入股cookie的名字相同,会修改或者覆盖原来的值 ...