6980|14

98

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

MAX32630FTHR设计笔记(4):10位ADC采样(解析及注意事项),中断式和非中断式 [复制链接]

 
本帖最后由 Justice_Gao 于 2017-7-8 11:00 编辑

今天周末,空下来给大家分享一下MAX32630的ADC采样程序,包括中断式和非中断式。
首先,我们来比较一下STM32F4与MAX32630在ADC方面的区别:
STM32F4:
(1)12位ADC
(2)支持DMA
(3)每个ADC通道自带数据寄存器
(4)最大转换速率2.4MHz
MAX32630:
(1)10位ADC
(2)不支持DMA
(3)每个ADC通道共用一个数据寄存器
(4)最大转换速率8MHz

下面给出非中断式和中断式的ADC采样程序
  1. /***** Includes *****/
  2. #include <stdio.h>
  3. #include <stdint.h>
  4. #include "mxc_config.h"
  5. #include "led.h"
  6. #include "adc.h"
  7. #include "nhd12832.h"
  8. #include "board.h"
  9. #include "max14690.h"
  10. #include "tmr_utils.h"

  11. /***** Definitions *****/
  12. const max14690_cfg_t max14690_cfg2 = {
  13.   .ldo2mv = 3300, /**< 3.3v in mV, connected to VDDB */
  14.   .ldo2mode = MAX14690_LDO_MPC1, /**< Enalbe LDO2 when +5v is present on VBUS */
  15.   .ldo3mv = 3300,  /**< 3.3v is L3OUT -- optional */
  16.   .ldo3mode = MAX14690_LDO_ENABLED /**< Enable the LDO. */
  17. };


  18. #define CLOCK 23
  19. /*------------------------------------------------------------
  20.                          usÑóê±oˉêy
  21. ------------------------------------------------------------*/
  22. void delay_us(uint32_t us)
  23. {
  24.         uint32_t n;                    
  25.         while(us--)for(n=0;n<CLOCK;n++);         
  26. }

  27. /*------------------------------------------------------------
  28.                          msÑóê±oˉêy
  29. ------------------------------------------------------------*/
  30. void delay_ms(uint32_t ms)
  31. {
  32.         while(ms--)delay_us(1000);         
  33. }

  34. /* Change to #undef USE_INTERRUPTS for polling mode */
  35. #define USE_INTERRUPTS 1
  36. //#undef USE_INTERRUPTS  注释掉为中断式,不注释则为非中断式
  37. /***** Globals *****/
  38. #ifdef USE_INTERRUPTS
  39. volatile unsigned int adc_done = 0;
  40. #endif

  41. /***** Functions *****/

  42. #ifdef USE_INTERRUPTS
  43. void AFE_IRQHandler(void)
  44. {
  45.     ADC_ClearFlags(MXC_F_ADC_INTR_ADC_DONE_IF);
  46.     /* Signal bottom half that data is ready */
  47.     adc_done = 1;
  48.    
  49.     return;
  50. }
  51. #endif
  52. /* ************************************************************************* */
  53. void ADC0_StartConvert(mxc_adc_chsel_t channel, unsigned int adc_scale, unsigned int bypass)
  54. {
  55.   uint32_t ctrl_tmp;

  56.   /* Clear the ADC done flag */
  57.   ADC_ClearFlags(MXC_F_ADC_INTR_ADC_DONE_IF);
  58.         MXC_ADC->intr |= MXC_F_ADC_INTR_ADC_DONE_IE;
  59.   /* Insert channel selection */
  60.   ctrl_tmp = MXC_ADC->ctrl;
  61.   ctrl_tmp &= ~(MXC_F_ADC_CTRL_ADC_CHSEL);
  62.   ctrl_tmp |= ((channel << MXC_F_ADC_CTRL_ADC_CHSEL_POS) & MXC_F_ADC_CTRL_ADC_CHSEL);
  63.   
  64.   /* Clear channel configuration */
  65.   ctrl_tmp &= ~(MXC_F_ADC_CTRL_ADC_REFSCL | MXC_F_ADC_CTRL_ADC_SCALE | MXC_F_ADC_CTRL_BUF_BYPASS);

  66.   /* ADC reference scaling must be set for all channels but two*/
  67.   if ((channel != ADC_CH_VDD18) && (channel != ADC_CH_VDD12)) {
  68.     ctrl_tmp |= MXC_F_ADC_CTRL_ADC_REFSCL;
  69.   }

  70.   /* Finalize user-requested channel configuration */
  71.   if (adc_scale || channel > ADC_CH_3) {
  72.     ctrl_tmp |= MXC_F_ADC_CTRL_ADC_SCALE;
  73.   }
  74.   if (bypass) {
  75.     ctrl_tmp |= MXC_F_ADC_CTRL_BUF_BYPASS;
  76.   }
  77.   
  78.   /* Write this configuration */
  79.   MXC_ADC->ctrl = ctrl_tmp;
  80.   
  81.   /* Start conversion */
  82.   MXC_ADC->ctrl |= MXC_F_ADC_CTRL_CPU_ADC_START;

  83. }
  84. int main(void)
  85. {
  86.     uint16_t adc_val[4];
  87.     unsigned int overflow[4];
  88.     uint8_t fmtstr[40];   
  89.     /* Initialize ADC */
  90.     ADC_Init();
  91.                 MAX14690_Init(&max14690_cfg2);
  92.    
  93. #ifdef USE_INTERRUPTS
  94.     NVIC_EnableIRQ(AFE_IRQn);
  95. #endif
  96.    
  97.     while(1) {

  98.         /* Convert channel 0 */
  99. #ifdef USE_INTERRUPTS
  100.         adc_done = 0;
  101.         ADC0_StartConvert(ADC_CH_0, 0, 1);
  102.         while (!adc_done);
  103. #else
  104.         ADC_StartConvert(ADC_CH_0, 0, 1);
  105. #endif
  106.         overflow[0] = (ADC_GetData(&adc_val[0]) == E_OVERFLOW ? 1 : 0);
  107.         /* Delay for 1/4 second before next reading */
  108.         TMR_Delay(MXC_TMR0, MSEC(250));

  109.     }
  110. }
复制代码


用KEIL开发的小伙伴们需要注意的几个问题是:
(1)//#undef USE_INTERRUPTS  注释掉为中断式,不注释则为非中断式
(2)ADC的参考电压为内部参考电压1.2V

(3)ADC源代码中断式采样会出现死循环,原因在于ADC_ClearFlags(MXC_F_ADC_INTR_ADC_DONE_IF);这条语句把ADC中断使能也清零了,如图所示,adc_done_ie清零,无法进入中断,程序会一直while (!adc_done);死循环。在源代码的void ADC0_StartConvert(这是我自己定义的函数,源代码中的为void ADC_StartConvert)中,在ADC_ClearFlags(MXC_F_ADC_INTR_ADC_DONE_IF);后加一条语句MXC_ADC->intr |= MXC_F_ADC_INTR_ADC_DONE_IE;,重新使能ADC中断,编译后测试成功




下次我给大家分享一下如何配置ADC通道的电压测量范围,主要有四种测量范围:(1)0~0.6V;(2)0~1.2V;(3)0~3V;(4)0~6V(AIN0和AIN1最大容忍电压为5V)。今天周末,休息一下。。。。。。求管理员加个精吧,分享这么多不容易呀

查看精华帖全部内容,请登录或者注册

最新回复

  详情 回复 发表于 2017-8-29 20:13

赞赏

1

查看全部赞赏

点赞 关注(1)
 

回复
举报

2774

帖子

8

TA的资源

版主

沙发
 
美信作为一个模拟大牛,在一款M4F芯片中装个10bit 的ADC实在看不懂……哪怕是STC的51也配了10bit的ADC了,这ADC存在感也太弱了 ,放眼看去,cortex M 好像还没有只带10bitADC的。可能是认为目的市场对ADC要求本来就很低,所以才搞个10bit的吧。

点评

哈哈 精度能达到要求就可以了 12位ADC的有,但是价格就高了  详情 回复 发表于 2017-7-8 17:03
 
 

回复

98

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
strong161 发表于 2017-7-8 12:19
美信作为一个模拟大牛,在一款M4F芯片中装个10bit 的ADC实在看不懂……哪怕是STC的51也配了10bit的ADC了, ...

哈哈 精度能达到要求就可以了 12位ADC的有,但是价格就高了
 
 
 

回复

189

帖子

5

TA的资源

一粒金砂(中级)

4
 
keil的没有pack包,,,,还要学习新的开发环境  eclespe   鸡肋

点评

那个也可以开发的  详情 回复 发表于 2017-7-9 08:43
 
 
 

回复

217

帖子

0

TA的资源

一粒金砂(高级)

5
 
keil都么有对应的PACK包,你怎么用的?

点评

PACK公司提供的  详情 回复 发表于 2017-7-9 08:43
个人签名心率传感器:https://shop108071095.taobao.com
 
 
 

回复

98

帖子

0

TA的资源

一粒金砂(中级)

6
 
anning865 发表于 2017-7-8 22:15
keil都么有对应的PACK包,你怎么用的?

PACK公司提供的  

点评

这是怎么回事呢?既然有PACK包,美信公司为什么不公布呢?前两天KEIL MDK更新,还是没有放出PACK包啊  详情 回复 发表于 2017-7-10 21:34
 
 
 

回复

98

帖子

0

TA的资源

一粒金砂(中级)

7
 
WZH70246 发表于 2017-7-8 22:13
keil的没有pack包,,,,还要学习新的开发环境  eclespe   鸡肋

那个也可以开发的
 
 
 

回复

217

帖子

0

TA的资源

一粒金砂(高级)

8
 

这是怎么回事呢?既然有PACK包,美信公司为什么不公布呢?前两天KEIL MDK更新,还是没有放出PACK包啊

点评

我的意思是说我自己公司提供的pack包  详情 回复 发表于 2017-7-11 09:10
个人签名心率传感器:https://shop108071095.taobao.com
 
 
 

回复

98

帖子

0

TA的资源

一粒金砂(中级)

9
 
anning865 发表于 2017-7-10 21:34
这是怎么回事呢?既然有PACK包,美信公司为什么不公布呢?前两天KEIL MDK更新,还是没有放出PACK包啊

我的意思是说我自己公司提供的pack包

点评

你们公司牛,看来你们是美信的忠实用户  详情 回复 发表于 2017-7-12 09:13
 
 
 

回复

217

帖子

0

TA的资源

一粒金砂(高级)

10
 
Justice_Gao 发表于 2017-7-11 09:10
我的意思是说我自己公司提供的pack包

你们公司牛,看来你们是美信的忠实用户
个人签名心率传感器:https://shop108071095.taobao.com
 
 
 

回复

661

帖子

29

TA的资源

版主

11
 
楼主厉害,给楼主点赞,不知美信公司有不有官方的例程代码呀?

点评

有 我发布的有一个帖子就是提供资源的  详情 回复 发表于 2017-7-12 14:41
个人签名QQ:252669569
 
 
 

回复

98

帖子

0

TA的资源

一粒金砂(中级)

12
 
lb8820265 发表于 2017-7-12 11:43
楼主厉害,给楼主点赞,不知美信公司有不有官方的例程代码呀?

有 我发布的有一个帖子就是提供资源的
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(中级)

13
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

14
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

15
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 2/8 下一条
Microchip 直播|利用motorBench开发套件高效开发电机磁场定向控制方案 报名中!
直播主题:利用motorBench开发套件高效开发电机磁场定向控制方案
直播时间:2025年3月25日(星期二)上午10:30-11:30
快来报名!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表