一、代码分享:

1、ADC头文件

  1. #ifndef ADC_H_
  2. #define ADC_H_
  3.  
  4. #include "common.h"
  5. typedef enum
  6. {
  7. // ---------------------------------ADC0-------------------------
  8. ADC0_DP0 = 0, // PTE20
  9. ADC0_SE0 = 0,
  10.  
  11. ADC0_DP1 = 1, // PTE16
  12. ADC0_SE1 = 1,
  13.  
  14. ADC0_DP2 = 2, // PTE18
  15. ADC0_SE2 = 2,
  16.  
  17. ADC0_DP3 = 3, // PTE22
  18. ADC0_SE3 = 3,
  19.  
  20. ADC0_DM0 = 4, // PTE21
  21. ADC0_SE4a= 4,
  22.  
  23. ADC0_DM1 = 5, // PTE17
  24. ADC0_SE5a= 5,
  25.  
  26. ADC0_DM2 = 6, // PTE19
  27. ADC0_SE6a= 6,
  28.  
  29. ADC0_DM3 = 7, // PTE23
  30. ADC0_SE7a= 7,
  31.  
  32. ADC0_SE4b= 4, // PTE29 不支持软件ADC,传递进软件触发ADC,会当作 a通道处理
  33.  
  34. ADC0_SE5b= 5, // PTD1 不支持软件ADC,传递进软件触发ADC,会当作 a通道处理
  35.  
  36. ADC0_SE6b= 6, // PTD5 不支持软件ADC,传递进软件触发ADC,会当作 a通道处理
  37.  
  38. ADC0_SE7b= 7, // PTD6 不支持软件ADC,传递进软件触发ADC,会当作 a通道处理
  39.  
  40. ADC0_SE8, // PTB0
  41.  
  42. ADC0_SE9, // PTB1
  43.  
  44. ADC0_RES0, // 保留
  45.  
  46. ADC0_SE11, // PTC2
  47.  
  48. ADC0_SE12, // PTB2
  49.  
  50. ADC0_SE13, // PTB3
  51.  
  52. ADC0_SE14, // PTC0
  53.  
  54. ADC0_SE15, // PTC1
  55.  
  56. ADC0_RES1, // 保留
  57.  
  58. ADC0_RES2, // 保留
  59.  
  60. ADC0_RES3, // 保留
  61.  
  62. ADC0_RES4, // 保留
  63.  
  64. ADC0_RES5, // 保留
  65.  
  66. ADC0_RES6, // 保留
  67.  
  68. ADC0_RES7, // 保留
  69.  
  70. ADC0_SE23, // PTE30
  71.  
  72. DAC0_OUT = ADC0_SE23, // PTE30 DAC0输出 ,传入 ADC函数会当作 ADC0_SE23 处理
  73.  
  74. ADC0_RES8, // 保留
  75.  
  76. ADC0_RES9, // 保留
  77.  
  78. Temp0_Sensor, // Temperature Sensor,内部温度测量,可用ADC函数
  79. Bandgap0, // 温度补偿结构带隙基准源 不支持ADC
  80. ADC0_RES10, // 保留
  81. VREFH0, // 参考高电压,可用ADC函数 ,结果恒为 2^n-1
  82. VREFL0, // 参考低电压,可用ADC函数 ,结果恒为 0
  83. Module0_Dis, // 不支持 ADC
  84.  
  85. } ADCn_Ch_e;
  86.  
  87. typedef enum //ADC模块
  88. {
  89. ADC0,
  90. ADC1
  91. } ADCn_e;
  92.  
  93. //精度位数
  94. typedef enum ADC_nbit
  95. {
  96. ADC_8bit = 0x00,
  97. ADC_10bit = 0x02,
  98. ADC_12bit = 0x01,
  99. ADC_16bit = 0x03
  100. } ADC_nbit;
  101.  
  102. enum HardwareAverage
  103. {
  104. sample4 = 0,
  105. sample8 = 1,
  106. sample16 = 2,
  107. sample32 = 3,
  108. };
  109.  
  110. //外部函数接口声明
  111.  
  112. extern void adc_init (ADCn_Ch_e); //ADC初始化
  113. extern uint16_t adc_once (ADCn_Ch_e, ADC_nbit); //采集一次一路模拟量的AD值
  114. extern uint16_t ad_ave(ADCn_Ch_e adcn_ch, ADC_nbit bit, uint8_t N); //均值滤波
  115.  
  116. extern void adc_stop (ADCn_e); //停止ADC转换
  117.  
  118. #endif

2、ADC主文件

  1. #include "adc.h"
  2.  
  3. ADC_MemMapPtr ADCN[1] = {ADC0_BASE_PTR}; //定义一个指针数组保存 ADCN 的地址
  4. void adc_start(ADCn_Ch_e adcn_ch, ADC_nbit bit) ;
  5.  
  6. /*!
  7. * @brief ADC初始化
  8. * @param ADCn_Ch_e ADC通道
  9. * @since v5.0
  10. * @note 此初始化仅支持软件触发,不是每个通道都支持ADC 软件触发,
  11. 具体说明见 ADCn_Ch_e 的注释说明
  12. * Sample usage: adc_init (ADC0_SE10 ); //初始化 ADC0_SE10 ,使用 PTA7 管脚
  13. */
  14. void adc_init(ADCn_Ch_e adcn_ch)
  15. {
  16.  
  17. uint8_t adcn = adcn_ch >> 5 ;
  18. //uint8_t ch = adcn_ch & 0x1F;
  19. //ADC_MemMapPtr adc_ptr = ADCN[adcn];
  20.  
  21. switch(adcn)
  22. {
  23. case ADC0: /* ADC0 */
  24. SIM_SCGC6 |= (SIM_SCGC6_ADC0_MASK ); //开启ADC0时钟
  25. SIM_SOPT7 &= ~(SIM_SOPT7_ADC0ALTTRGEN_MASK | SIM_SOPT7_ADC0PRETRGSEL_MASK);
  26. SIM_SOPT7 |= SIM_SOPT7_ADC0TRGSEL(0);
  27. break;
  28.  
  29. default:
  30. ASSERT(0);
  31. }
  32.  
  33. switch(adcn_ch)
  34. {
  35.  
  36. case ADC0_SE0:
  37. port_init(PTE20, ALT0);
  38. break;
  39. case ADC0_SE1:
  40. port_init(PTE16, ALT0);
  41. break;
  42. case ADC0_SE2:
  43. port_init(PTE18, ALT0);
  44. break;
  45. case ADC0_SE3:
  46. port_init(PTE22, ALT0);
  47. break;
  48. case ADC0_SE4a:
  49. port_init(PTE21, ALT0);
  50. break;
  51. case ADC0_SE5a:
  52. port_init(PTE17, ALT0);
  53. break;
  54. case ADC0_SE6a:
  55. port_init(PTE19, ALT0);
  56. break;
  57. case ADC0_SE7a:
  58. port_init(PTE23, ALT0);
  59. break;
  60. case ADC0_SE8:
  61. port_init(PTB0, ALT0);
  62. break;
  63. case ADC0_SE9:
  64. port_init(PTB1, ALT0);
  65. break;
  66. case ADC0_SE11:
  67. port_init(PTC2, ALT0);
  68. break;
  69. case ADC0_SE12:
  70. port_init(PTB2, ALT0);
  71. break;
  72. case ADC0_SE13:
  73. port_init(PTB3, ALT0);
  74. break;
  75. case ADC0_SE14:
  76. port_init(PTC0, ALT0);
  77. break;
  78. case ADC0_SE15:
  79. port_init(PTC1, ALT0);
  80. break;
  81. case ADC0_SE23:
  82. port_init(PTE30, ALT0);
  83. break;
  84.  
  85. case Temp0_Sensor: // Temperature Sensor,内部温度测量,可用ADC函数
  86. break;
  87. case VREFH0: // 参考高电压,可用ADC函数 ,结果恒为 2^n-1
  88. break;
  89. case VREFL0: // 参考低电压,可用ADC函数 ,结果恒为 0
  90. break;
  91.  
  92. default:
  93. ASSERT(0); //断言,传递的管脚不支持 ADC 单端软件触发,请换 其他管脚
  94. break;
  95. }
  96.  
  97. }
  98.  
  99. uint16_t adc_once(ADCn_Ch_e adcn_ch, ADC_nbit bit) //采集某路模拟量的AD值
  100. {
  101. ADCn_e adcn = (ADCn_e)(adcn_ch >> 5) ;
  102.  
  103. uint16_t result = 0;
  104.  
  105. adc_start(adcn_ch, bit); //启动ADC转换
  106.  
  107. while (( ADC_SC1_REG(ADCN[adcn], 0 ) & ADC_SC1_COCO_MASK ) != ADC_SC1_COCO_MASK); //只支持A通道
  108. result = ADC_R_REG(ADCN[adcn], 0);
  109. ADC_SC1_REG(ADCN[adcn], 0) &= ~ADC_SC1_COCO_MASK;
  110. return result;
  111. }
  112. /*************************************************************************
  113. * 野火嵌入式开发工作室
  114. *
  115. * 函数名称:ad_ave
  116. * 功能说明:多次采样,取平均值
  117. * 参数说明:ADCx 模块号( ADC0、 ADC1)
  118. * ADC_Channel 通道号
  119. * ADC_nbit 精度( ADC_8bit,ADC_12bit, ADC_10bit, ADC_16bit )
  120. * N 均值滤波次数(范围:0~255)
  121. * 函数返回:16位无符号结果值
  122. * 修改时间:2012-2-10
  123. * 备 注:修改苏州大学的例程
  124. *************************************************************************/
  125.  
  126. uint16_t ad_ave(ADCn_Ch_e adcn_ch, ADC_nbit bit, uint8_t N) //均值滤波
  127. {
  128. uint32_t tmp = 0;
  129. uint8_t i;
  130. //ASSERT( ((adcn == ADC0) && (ch >= AD8 && ch <= AD18)) || ((adcn == ADC1) && (ch >= AD4a && ch <= AD17)) ) ; //使用断言检测ADCn_CHn是否正常
  131.  
  132. for(i = 0; i < N; i++)
  133. tmp += adc_once(adcn_ch,bit);
  134. tmp = tmp / N;
  135. return (uint16_t)tmp;
  136. }
  137. /*!
  138. * @brief 启动ADC软件采样(不支持B通道)
  139. * @param ADCn_Ch_e ADC通道
  140. * @param ADC_nbit ADC精度( ADC_8bit,ADC_12bit, ADC_10bit, ADC_16bit )
  141. * @since v5.0
  142. * @note 此函数内部调用,启动后即可等待数据采集完成
  143. * Sample usage: adc_start(ADC0_SE10, ADC_8bit);
  144. */
  145. void adc_start(ADCn_Ch_e adcn_ch, ADC_nbit bit)
  146. {
  147. ADCn_e adcn = (ADCn_e)(adcn_ch >> 5) ;
  148. uint8_t ch = (uint8_t)(adcn_ch & 0x1F);
  149.  
  150. //初始化ADC默认配置
  151. ADC_CFG1_REG(ADCN[adcn]) = (0
  152. //| ADC_CFG1_ADLPC_MASK //ADC功耗配置,0为正常功耗,1为低功耗
  153. | ADC_CFG1_ADIV(2) //时钟分频选择,分频系数为 2^n,2bit
  154. | ADC_CFG1_ADLSMP_MASK //采样时间配置,0为短采样时间,1 为长采样时间
  155. | ADC_CFG1_MODE(bit)
  156. | ADC_CFG1_ADICLK(0) //0为总线时钟,1为总线时钟/2,2为交替时钟(ALTCLK),3为 异步时钟(ADACK)。
  157. );
  158.  
  159. ADC_CFG2_REG(ADCN[adcn]) = (0
  160. //| ADC_CFG2_MUXSEL_MASK //ADC复用选择,0为a通道,1为b通道。
  161. //| ADC_CFG2_ADACKEN_MASK //异步时钟输出使能,0为禁止,1为使能。
  162. | ADC_CFG2_ADHSC_MASK //高速配置,0为正常转换序列,1为高速转换序列
  163. | ADC_CFG2_ADLSTS(0) //长采样时间选择,ADCK为4+n个额外循环,额外循环,0为20,1为12,2为6,3为2
  164. );
  165.  
  166. //写入 SC1A 启动转换
  167. ADC_SC1_REG(ADCN[adcn], 0 ) = (0
  168. | ADC_SC1_AIEN_MASK // 转换完成中断,0为禁止,1为使能
  169. //| ADC_SC1_DIFF_MASK // 差分模式使能,0为单端,1为差分
  170. | ADC_SC1_ADCH( ch ) //输入通道选择位
  171. );
  172.  
  173. //ADC_SC1_REG(ADCN[adcn], 1 ) = 0;
  174. }
  175.  
  176. /*!
  177. * @brief 停止ADC软件采样
  178. * @param ADCn_e ADC模块号( ADC0、 ADC1)
  179. * @since v5.0
  180. * Sample usage: adc_stop(ADC0);
  181. */
  182. void adc_stop(ADCn_e adcn)
  183. {
  184. ADC_SC1_REG(ADCN[adcn], 0) = (0
  185. | ADC_SC1_AIEN_MASK // 转换完成中断,0为禁止,1为使能
  186. //| ADC_SC1_DIFF_MASK // 差分模式使能,0为单端,1为差分
  187. | ADC_SC1_ADCH(Module0_Dis) //输入通道选择,此处选择禁止通道
  188. );
  189. }

二、使用方法:

  1. uint16_t t=0;
  2. adc_init(ADC0_DP0); //ADC初始化
  3.  
  4. while(1)
  5. {
  6. t = adc_once(ADC0_DP0, ADC_16bit); //采集一次一路模拟量的AD值
  7. }

智能车学习(三)—— ADC学习的更多相关文章

  1. java_web学习(三) eclipse_jsp学习

    1.首先打开eclipse,新建一个Dynamac web project项目文件 2.在WebContent单击右键创建JSP File 3.过程 4.简单的jsp代码 运行结果: 5.导出war文 ...

  2. Html学习(三) 分类学习

    代码: <h1>这是一级分类吗</h1> <h2>这是二级分类吗</h2> <h3>这是三级分类吗 </h3> 效果: 介绍: ...

  3. 智能车学习(十五)——K60野火2013版例程

    一.中断函数注册方法: 1.格式: 配置某个功能的中断 注册中断函数 开启中断 2.一个例子 pit_init_ms(PIT0,);//定时中断初始化 set_vector_handler(PIT0_ ...

  4. 智能车学习(二)—— GPIO学习

    一.概述 使用的是蓝宇的底层,主要有初始化管脚,设置管脚状态,反转管脚状态等. 二.代码重述: 1.头文件gpio.h #ifndef GPIO_H //防止重复定义(gpio_H 开头) #defi ...

  5. [ZZ] 深度学习三巨头之一来清华演讲了,你只需要知道这7点

    深度学习三巨头之一来清华演讲了,你只需要知道这7点 http://wemedia.ifeng.com/10939074/wemedia.shtml Yann LeCun还提到了一项FAIR开发的,用于 ...

  6. 20175314 《Java程序设计》第三周学习总结

    20175314 <Java程序设计>第三周学习总结 教材学习内容总结 编程语言的发展事是从面向机器(汇编.机器)到面向过程(C)再到面向对象(Java) 成员变量: 1.成员变量定义在类 ...

  7. (java)selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待

    selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待 本例包括窗口最大化,刷新,切换到指定窗口,后退,前进,获取当前窗口url等操作: import java. ...

  8. HTTP学习三:HTTPS

    HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...

  9. 20145213《Java程序设计》第三周学习总结

    20145213<Java程序设计>第三周学习总结 教材学习内容总结 正所谓距离产生美,上周我还倾心于Java表面的基础语法.其简单的流程结构,屈指可数的基本类型分类,早已烂熟于心的运算符 ...

  10. 20145304 Java第三周学习报告

    20145304 <Java程序设计>第三周学习总结 教材学习内容总结 1.定义类: 类定义时使用class关键词,建立实例要使用new关键词. 代码如下: /*定义类 书上例子 衣服的型 ...

随机推荐

  1. Core Data 多线程时多个context使用

    原文地址:http://blog.csdn.net/willmomo/article/details/19759413 写的非常好!我这里截取一点重要的,备份,请去原地址阅读! 本人去年10月份才接触 ...

  2. ios 使用autolayout 后button 的frame 无法设置问题!

    问题见这里,只能通过bounds和center进行设置!http://www.cocoachina.com/bbs/read.php?tid-236862.html 待研究!!!!~~~

  3. Django~Test View

    https://docs.djangoproject.com/en/1.9/topics/testing/ http://docs.seleniumhq.org/ Automated testing ...

  4. Divide and conquer:Matrix(POJ 3685)

    矩阵 题目大意:矩阵里面的元素按i*i + 100000 * i + j*j - 100000 * j + i*j填充(i是行,j是列),求最小的M个数 这一题要用到两次二分,实在是二分法的经典,主要 ...

  5. 自定义ToolBar之一

    其实已经有很多大神写过这方面的文章了,不过我比较蠢吧,老有一些地方看不懂的,翻了很多关于Toolbar方面的文章和视频,这儿总结一下.  参考资料:youtube:slidenerd 阶段一 自定义配 ...

  6. .NET后台如何获取前台HMTL控件的值

    很多时候我们需要HTML控件,感觉比服务器控件更加简介,清爽,那么如何获取HMTL控件的值呢,请看下面例子: 前台页面代码: <input id="Text1" type=& ...

  7. 修改VS2010生成的dll文件中的内容

    我的电脑是64为的操作系统,所以先找到下面的路径 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin 找到这个文件:ildasm.exe,如 ...

  8. [Android Pro] AES加密

    reference to :http://blog.csdn.net/wfung_kwok/article/details/7766427 package com.secufity.aes; impo ...

  9. 狼抓兔子(bzoj 1010)

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...

  10. 昨晚把家里的ie升级到11

    其实网上有些东西是实用的,不过之前的一次锁屏唤醒机器死机我就强制关机了,昨天把大部分驱动升级.