社区导航

 

搜索
查看: 4489|回复: 14

[设计过程分享] MAX32630FTHR设计笔记(4):10位ADC采样(解析及注意事项),中断式和非中断式

[复制链接]

113

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-7-8 10:55 | 显示全部楼层 |阅读模式
本帖最后由 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
QQ截图20170708105017.png
(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中断,编译后测试成功
QQ截图20170708103354.png
QQ截图20170708104033.png


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

评分

1

查看全部评分



回复

使用道具 举报

2818

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

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

点评

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


回复

使用道具 举报

113

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-7-8 17:03 | 显示全部楼层
strong161 发表于 2017-7-8 12:19
美信作为一个模拟大牛,在一款M4F芯片中装个10bit 的ADC实在看不懂……哪怕是STC的51也配了10bit的ADC了, ...

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


回复

使用道具 举报

206

TA的帖子

5

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-7-8 22:13 | 显示全部楼层
keil的没有pack包,,,,还要学习新的开发环境  eclespe   鸡肋

点评

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


回复

使用道具 举报

227

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2017-7-8 22:15 | 显示全部楼层
keil都么有对应的PACK包,你怎么用的?

点评

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


回复

使用道具 举报

113

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-7-9 08:43 | 显示全部楼层
anning865 发表于 2017-7-8 22:15
keil都么有对应的PACK包,你怎么用的?

PACK公司提供的  

点评

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


回复

使用道具 举报

113

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-7-9 08:43 | 显示全部楼层
WZH70246 发表于 2017-7-8 22:13
keil的没有pack包,,,,还要学习新的开发环境  eclespe   鸡肋

那个也可以开发的


回复

使用道具 举报

227

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2017-7-10 21:34 | 显示全部楼层

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

点评

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


回复

使用道具 举报

113

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

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

点评

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


回复

使用道具 举报

227

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2017-7-12 09:13 | 显示全部楼层
Justice_Gao 发表于 2017-7-11 09:10
我的意思是说我自己公司提供的pack包

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


回复

使用道具 举报

547

TA的帖子

21

TA的资源

版主

Rank: 6Rank: 6

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

点评

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


回复

使用道具 举报

113

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

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


回复

使用道具 举报

27

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-7-28 14:58 | 显示全部楼层


回复

使用道具 举报

9

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-8-2 20:32 | 显示全部楼层


回复

使用道具 举报

5

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-8-29 20:13 | 显示全部楼层


回复

使用道具 举报

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

关闭

站长推荐上一条 1/4 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-4-6 07:17 , Processed in 0.419622 second(s), 21 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表