搜索

[技术问答] 新塘M487多通道ADC采集问题,不能为0

[复制链接]
896|6
plan_1|  楼主 | 2021-6-3 16:57 | 显示全部楼层 |阅读模式
本帖最后由 plan_1 于 2021-6-3 17:03 编辑

现有问题就是 采用软件触发多通道采集ADC,开启了PB的所有通道,通道直接接GND都不能为0之所以用软件触发,就是不想用中断触发AD
时钟配置为clock配置工具配置的,具体见图 360截图16860710110121101.png
9929160b89823bcd04.png
引脚配置也是工具生成的,如下图
5805760b898536575f.png
  1. #include "M487EADC.h"

  2. uint32_t ADCpin = BIT15 | BIT14 | BIT11 | BIT10 | BIT9 | BIT8 | BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0;
  3. uint32_t ADCInputModePin = 0xcfff;
  4. //uint32_t ADCpin = BIT7|BIT6;

  5. void M487EADC_Init(void)
  6. {
  7.   /*复位EADC控制器*/
  8. //  EADC_CONV_RESET(EADC);
  9.         
  10.         /* Set PB.0 ~ PB.3 to input mode */
  11.   PB->MODE &= ~ADCInputModePin;
  12. //        GPIO_SetMode(PB,ADCInputModePin,GPIO_MODE_INPUT);
  13.   /* Set reference voltage to external pin (3.3V) */
  14.   SYS_SetVRef(SYS_VREFCTL_VREF_PIN);
  15.   /* Enable temperature sensor */
  16.   SYS->IVSCTL |= (SYS_IVSCTL_VTEMPEN_Msk  |SYS_IVSCTL_VBATUGEN_Msk);
  17.   /*ADC 结果位数选择12位ADC 结果存入RESULT (EADC_DATn[11:0]).*/
  18.   EADC->CTL &= (~EADC_CTL_RESSEL_Msk);
  19.   EADC->CTL |= EADC_CTL_RESSEL_Msk;
  20.   /* 将输入模式设置为单端并启用A/D转换器 */
  21.   EADC_Open(EADC, EADC_CTL_DIFFEN_SINGLE_END);

  22.   /*设置ADC的触发方式为软件触发*/
  23.   EADC_ConfigSampleModule(EADC, 0, EADC_SOFTWARE_TRIGGER, 0);
  24.   EADC_ConfigSampleModule(EADC, 1, EADC_SOFTWARE_TRIGGER, 1);
  25.   EADC_ConfigSampleModule(EADC, 2, EADC_SOFTWARE_TRIGGER, 2);
  26.   EADC_ConfigSampleModule(EADC, 3, EADC_SOFTWARE_TRIGGER, 3);
  27.   EADC_ConfigSampleModule(EADC, 4, EADC_SOFTWARE_TRIGGER, 4);
  28.   EADC_ConfigSampleModule(EADC, 5, EADC_SOFTWARE_TRIGGER, 5);
  29.   EADC_ConfigSampleModule(EADC, 6, EADC_SOFTWARE_TRIGGER, 6);
  30.   EADC_ConfigSampleModule(EADC, 7, EADC_SOFTWARE_TRIGGER, 7);
  31.   EADC_ConfigSampleModule(EADC, 8, EADC_SOFTWARE_TRIGGER, 8);
  32.   EADC_ConfigSampleModule(EADC, 9, EADC_SOFTWARE_TRIGGER, 9);
  33.   EADC_ConfigSampleModule(EADC, 10, EADC_SOFTWARE_TRIGGER, 10);
  34.   EADC_ConfigSampleModule(EADC, 11, EADC_SOFTWARE_TRIGGER, 11);
  35.   EADC_ConfigSampleModule(EADC, 14, EADC_SOFTWARE_TRIGGER, 14);
  36.   EADC_ConfigSampleModule(EADC, 15, EADC_SOFTWARE_TRIGGER, 15);

  37.   EADC_ConfigSampleModule(EADC, 16, EADC_SOFTWARE_TRIGGER, 16);
  38.   EADC_ConfigSampleModule(EADC, 17, EADC_SOFTWARE_TRIGGER, 17);
  39.   EADC_ConfigSampleModule(EADC, 18, EADC_SOFTWARE_TRIGGER, 18);

  40.   /*设置ADC延长采样时间。*/
  41.   //  EADC_SetExtendSampleTime(EADC, 0, 0xF);
  42.   //  EADC_SetExtendSampleTime(EADC, 1, 0xF);
  43.   //  EADC_SetExtendSampleTime(EADC, 2, 0xF);
  44.   //  EADC_SetExtendSampleTime(EADC, 3, 0xF);
  45.   //  EADC_SetExtendSampleTime(EADC, 4, 0xF);
  46.   //  EADC_SetExtendSampleTime(EADC, 5, 0xF);
  47.   //  EADC_SetExtendSampleTime(EADC, 6, 0xF);
  48.   //  EADC_SetExtendSampleTime(EADC, 7, 0xF);
  49.   //  EADC_SetExtendSampleTime(EADC, 8, 0xF);
  50.   //  EADC_SetExtendSampleTime(EADC, 9, 0xF);
  51.   //  EADC_SetExtendSampleTime(EADC, 10, 0xF);
  52.   //  EADC_SetExtendSampleTime(EADC, 11, 0xF);
  53.   //  EADC_SetExtendSampleTime(EADC, 14, 0xF);
  54.   //  EADC_SetExtendSampleTime(EADC, 15, 0xF);

  55.   //  EADC_SetExtendSampleTime(EADC, 16, 0xF);
  56.   //  EADC_SetExtendSampleTime(EADC, 17, 0x3F);
  57.   //  EADC_SetExtendSampleTime(EADC, 18, 0xF);

  58.   EADC_SetTriggerDelayTime(EADC, 0, 0xf, EADC_SCTL_TRGDLYDIV_DIVIDER_16);
  59.   EADC_SetTriggerDelayTime(EADC, 1, 0xf, EADC_SCTL_TRGDLYDIV_DIVIDER_16);
  60.   EADC_SetTriggerDelayTime(EADC, 2, 0xf, EADC_SCTL_TRGDLYDIV_DIVIDER_16);
  61.   EADC_SetTriggerDelayTime(EADC, 3, 0xf, EADC_SCTL_TRGDLYDIV_DIVIDER_16);
  62.   EADC_SetTriggerDelayTime(EADC, 4, 0xf, EADC_SCTL_TRGDLYDIV_DIVIDER_16);
  63.   EADC_SetTriggerDelayTime(EADC, 5, 0xf, EADC_SCTL_TRGDLYDIV_DIVIDER_16);
  64.   EADC_SetTriggerDelayTime(EADC, 6, 0xf, EADC_SCTL_TRGDLYDIV_DIVIDER_16);
  65.   EADC_SetTriggerDelayTime(EADC, 7, 0xf, EADC_SCTL_TRGDLYDIV_DIVIDER_16);
  66.   EADC_SetTriggerDelayTime(EADC, 8, 0xf, EADC_SCTL_TRGDLYDIV_DIVIDER_16);
  67.   EADC_SetTriggerDelayTime(EADC, 9, 0xf, EADC_SCTL_TRGDLYDIV_DIVIDER_16);
  68.   EADC_SetTriggerDelayTime(EADC, 10, 0xf, EADC_SCTL_TRGDLYDIV_DIVIDER_16);
  69.   EADC_SetTriggerDelayTime(EADC, 11, 0xf, EADC_SCTL_TRGDLYDIV_DIVIDER_16);
  70.   EADC_SetTriggerDelayTime(EADC, 14, 0xf, EADC_SCTL_TRGDLYDIV_DIVIDER_16);
  71.   EADC_SetTriggerDelayTime(EADC, 15, 0xf, EADC_SCTL_TRGDLYDIV_DIVIDER_16);
  72.         
  73.         EADC_SetTriggerDelayTime(EADC, 16, 0xf, EADC_SCTL_TRGDLYDIV_DIVIDER_16);
  74.   EADC_SetTriggerDelayTime(EADC, 17, 0x3f, EADC_SCTL_TRGDLYDIV_DIVIDER_16);
  75.   EADC_SetTriggerDelayTime(EADC, 18, 0xf, EADC_SCTL_TRGDLYDIV_DIVIDER_16);

  76.   
  77.   /* 禁用GPB0-GPB11,GPB14、GPB15数字输入路径以避免泄漏电流 */
  78.   GPIO_DISABLE_DIGITAL_PATH(PB, ADCpin);
  79.         /* 开启ADC软件触发模式,参数BIT对应相应的通道 */
  80. //  EADC_START_CONV(EADC, ADCpin | BIT16 | BIT17 | BIT18);
  81. }

复制代码
然后main函数中 使用如下:
  1. int main()
  2. {
  3.                 uint16_t Band_gap,Temperature;
  4. //    SYS_Init();
  5.           M487JIDAE_ClockConfigure_init();
  6.                 M487JIDAE_PinConfigure_init();
  7.     /* Init UART to 115200-8n1 for print message */
  8.     M487UART_Init(UART0, UART0_IRQn);
  9.                 M487UART_Init(UART1, UART1_IRQn);
  10.                 M487UART_Init(UART2, UART2_IRQn);
  11.                 M487EADC_Init();
  12.                 M487TIMER_Init();
  13.     /* Connect UART to PC, and open a terminal tool to receive following message */
  14.     printf("Hello World\n");
  15.                 printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);

  16.     printf("+-------------------------------------------------+\n");
  17.     printf("|    PH.0(Output) PH.1(Output) PH.2(Output)     |\n");
  18.     printf("+-------------------------------------------------+\n\n");

  19.     /*-----------------------------------------------------------------------------------------------------*/
  20.     /* GPIO Basic Mode Test --- Use Pin Data Input/Output to control GPIO pin                              */
  21.     /*-----------------------------------------------------------------------------------------------------*/

  22.     /* Configure PB.3 as Output mode and PD.8 as Input mode then close it */
  23.     GPIO_SetMode(PH, BIT0, GPIO_MODE_OUTPUT);
  24.     GPIO_SetMode(PH, BIT1, GPIO_MODE_OUTPUT);
  25.                 GPIO_SetMode(PH, BIT2, GPIO_MODE_OUTPUT);
  26.                
  27.                
  28.                 /* Configure PB.3 and PD.8 to default Quasi-bidirectional mode */
  29. //    GPIO_SetMode(PB, BIT3, GPIO_MODE_QUASI);
  30. //    GPIO_SetMode(PD, BIT8, GPIO_MODE_QUASI);
  31.                
  32.     /* Got no where to go, just loop forever */
  33.                
  34.                 /* 开启ADC软件触发模式,参数BIT对应相应的通道 */
  35.                 EADC_START_CONV(EADC, ADCpin|BIT16|BIT17|BIT18);
  36.     while(1)
  37.                 {
  38.                                 
  39. //                        printf("PH0 Delay 1 second\n");
  40. //                        PH0=~PH0;
  41. //                        TIMER_Delay(TIMER0, 1000000);
  42. //                        printf("PH1 Delay 1 second\n");
  43. //                        PH1=~PH1;
  44. //                        TIMER_Delay(TIMER0, 1000000);
  45. //                        printf("PH2 Delay 1 second\n");
  46.                         /* 查询相应通道是否转换完毕 */
  47.                         if((EADC_GET_PENDING_CONV(EADC)&ADCpin) == 0)
  48.                         {
  49.                                 printf("EADC_GET_PENDING_CONV=:%x\n",EADC_GET_PENDING_CONV(EADC));
  50.                                 printf("ADC0=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 0));
  51.                                 printf("ADC1=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 1));
  52.                                 printf("ADC2=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 2));
  53.                                 printf("ADC3=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 3));
  54.                                 printf("ADC4=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 4));
  55.                                 printf("ADC5=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 5));
  56.                                 printf("ADC6=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 6));
  57.                                 printf("ADC7=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 7));
  58.                                 printf("ADC8=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 8));
  59.                                 printf("ADC9=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 9));
  60.                                 printf("ADC10=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 10));
  61.                                 printf("ADC11=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 11));
  62.                                 printf("ADC14=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 14));
  63.                                 printf("ADC15=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 15));
  64.                                 
  65. //                                printf("ADC16=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 16));
  66.                                 Band_gap=(uint16_t)EADC_GET_CONV_DATA(EADC, 16);
  67.                                 printf("Band-gap = %.2f\n", ((float)Band_gap/4095)*(float)(3.3));
  68.                                 Temperature=(uint16_t)EADC_GET_CONV_DATA(EADC, 17);
  69. //                                printf("ADC17=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 17));
  70.                                 printf("Temperature = %2.1f\n", (25+(((float)Temperature/4095*3300)-675)/(-1.83)));
  71.                                 
  72.                                 printf("ADC18=:%d\n",(uint16_t)EADC_GET_CONV_DATA(EADC, 18));
  73.                                 /* 开启ADC软件触发模式,参数BIT对应相应的通道 */
  74.                                 EADC_START_CONV(EADC, ADCpin|BIT16|BIT17|BIT18);
  75.                         }
复制代码
打印出来的结果是这样的
9673760b89914afb87.png

各个通过怎么都不能为0,用电位器调节时,只扭一半行程就4095了,还有大半圈没有到头

电路板用的是官方 NuMaker-PFM-M487,

这个问题困扰几天了,求大神解答


使用特权

评论回复
weifeng90| | 2021-6-4 07:21 | 显示全部楼层
单通道测试一下

使用特权

评论回复
yangxiaor520| | 2021-6-4 07:49 | 显示全部楼层
先试一下单通道采集有无问题

使用特权

评论回复
plan_1|  楼主 | 2021-6-4 09:22 | 显示全部楼层
4252560b9805f8ec9a.png
单通道也是一样的,任何一个通道都试过

使用特权

评论回复
plan_1|  楼主 | 2021-6-4 09:23 | 显示全部楼层
yangxiaor520 发表于 2021-6-4 07:49
先试一下单通道采集有无问题

单通道也是一样的,任何一个通道都试过

使用特权

评论回复
sadicy| | 2021-6-16 09:27 | 显示全部楼层
我想看一下直接接GND的效果,
万用表量一下实际电压是多少。
要不是实际电压有问题,要不是转换有问题,先排除一半

使用特权

评论回复
汽车电子| | 2021-6-19 21:28 | 显示全部楼层
看看时间配置是否有问题?
如果转换时间足够,根本不需要查询,定时读取结果就可以,读取完多个通道结果,即启动下次转换。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

本版热帖

本版活跃用户

优质原创写原创,赢大奖

编辑推荐

  • 1 wolfe_yu 得到打赏 ¥180.00
  • 2 最美葫芦娃 得到打赏 ¥155.00
  • 3 hk386 得到打赏 ¥75.00
  • 4 火星国务卿 得到打赏 ¥63.00
  • 5 两只袜子 得到打赏 ¥56.00
  • 6 laocuo1142 得到打赏 ¥50.00
  • 7 linghz 得到打赏 ¥45.00
  • 8 gaon2 得到打赏 ¥45.00
  • 9 ezcui 得到打赏 ¥45.00
  • 10 jlc317 得到打赏 ¥40.00
在线客服 快速回复 返回顶部 返回列表