[APM32F0] APM32F003F6P6芯片,想要ADC采集5个引脚的电压,实际只能读取3个.

[复制链接]
 楼主| yuanliangbeyond 发表于 2025-6-27 09:34 | 显示全部楼层 |阅读模式
本帖最后由 yuanliangbeyond 于 2025-6-27 16:29 编辑

APM32F003F6P6芯片,ADC采集五个引脚的电压,实际只能读取到3个,原因不明.


  1. void ADC_Calibration(void){
  2.     uint8_t i;
  3.     int8_t offset = 0;
  4.     uint16_t adcData = 0;

  5.     ADC_SetOffset(0);
  6.     ADC_EnableCompensation();
  7.     ADC_ClearStatusFlag(ADC_FLAG_CC);
  8.     ADC_Enable();
  9.     ADC_StartConversion();

  10.     for(i = 0; i < 10; i++) {
  11.         while(ADC_ReadStatusFlag(ADC_FLAG_CC) == RESET);
  12.         ADC_ClearStatusFlag(ADC_FLAG_CC);
  13.     }
  14.     ADC_Disable();

  15.     adcData = ADC_ReadData();
  16.     offset = (int8_t)(0x800 - adcData);
  17.     ADC_SetOffset(offset);

  18.     ADC_DisableCompensation();
  19.     ADC_ClearStatusFlag(ADC_FLAG_CC);
  20. }


  21. void ADC_ContinuousScanInit(void){
  22.     ADC_Config_T adcConfig;
  23.     GPIO_Config_T gpioConfig;

  24.     gpioConfig.intEn = GPIO_EINT_DISABLE;
  25.     gpioConfig.mode = GPIO_MODE_IN_FLOATING;
  26.     gpioConfig.pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_4| GPIO_PIN_3;    //AIN0:PC5, AIN1:PC6,AIN2:PC4, AIN3:PD2--烧录口,AIN4:PD3,AIN5:PD5,AIN6:PD6,AIN7:PC3
  27.     GPIO_Config(GPIOC, &gpioConfig);

  28.     gpioConfig.pin = GPIO_PIN_3;
  29.     GPIO_Config(GPIOD, &gpioConfig);

  30.     ADC_SetMode(ADC_MODE_SINGLE_END);

  31.     ADC_ConfigStructInit(&adcConfig);
  32.     adcConfig.div = ADC_DIV_4;
  33.     adcConfig.convMode = ADC_CONV_MODE_CONTINUOUS;
  34.     adcConfig.scanMode = ADC_SCAN_MODE_ENABLE;
  35.     adcConfig.interrupt = ADC_INT_CC;
  36.     adcConfig.channel = ADC_CHANNEL_2; //ADC_CHANNEL_0  ADC_CHANNEL_1 ADC_CHANNEL_2
  37.     ADC_Config(&adcConfig);

  38.     ADC_Calibration();

  39.     ADC_Enable();
  40.     ADC_StartConversion();
  41. }


  42. void ADC_PollForConversion(void){
  43.     uint16_t voltage = 0;
  44.     uint16_t adcArray[10] = {0};
  45.     uint8_t bufferIndex;

  46.     SEGGER_RTT_printf(0, "===========ADC_PollForConversion===2222=======\r\n");

  47.     if(ADC_ReadStatusFlag(ADC_FLAG_CC) == SET){
  48.         // SEGGER_RTT_printf(0, "===========ADC_PollForConversion===55555=======\r\n");
  49.         ADC_ClearStatusFlag(ADC_FLAG_CC);
  50.         for(bufferIndex = 0; bufferIndex < 8; bufferIndex++){
  51.             adcArray[bufferIndex] = ADC_ReadBufferData((ADC_BUFFER_IDX_T)(bufferIndex));
  52.         }

  53.         for(bufferIndex = 0; bufferIndex < 8; bufferIndex++){
  54.         
  55.             voltage = (adcArray[bufferIndex] * 3300) / 4095;
  56.             // printf("ADC Channel %d Value:%d\r\n", bufferIndex, voltage);
  57.             SEGGER_RTT_printf(0, "===========ADC_PollForConversion=1111==========ADC,  Channel:%d,  vol:%d \r\n",bufferIndex, voltage);
  58.         }
  59.     }
  60. }






9941916f44e990eb10c0ae99c0d41d9.png


1750987903592.jpg
  
Alden 发表于 2025-6-27 09:59 | 显示全部楼层
003的ADC连续扫描模式是只能固定从0通道开始扫到n通道,如果用4个ADC通道最好用0,1,2,3的顺序通道,PC3是通道7,用的话之间几个引脚会受影响。把adcConfig.channel = ADC_CHANNEL_2;改成ADC_CHANNEL_3,bufferIndex 的数组加大就可以了

评论

[url=home.php?mod=space&uid=3520416]@yuanliangbeyond[/url] :数据手册里面有的噢  发表于 2025-6-27 10:56
我需要采集ADC的总共有5个引脚,分别是"PC3,PC4,PC5,PC6,PD3", 请问, 我应该如何写程序呢?  发表于 2025-6-27 10:27
你上面说"PC3是通道7", 请问, 这个从哪里查到的呢,告诉我吧, 我也去查一下手册.  发表于 2025-6-27 10:20
好像不行, 改成ADC_CHANNEL_3以后, 单片机能正常运行程序, 但是烧录口好像被占用了一样, 无法再次烧录程序. 只能复位恢复出厂设置.  发表于 2025-6-27 10:18
 楼主| yuanliangbeyond 发表于 2025-6-27 10:26 | 显示全部楼层
我需要采集ADC的总共有5个引脚,分别是"PC3,PC4,PC5,PC6,PD3", 请问, 我应该如何写程序呢?
真的问题不大 发表于 2025-6-27 10:59 | 显示全部楼层
翻了下他们的手册,大概数据手册的第8、9页的位置,PC3引脚可以被配置用作通道7
77361685e08a594847.png
SirenSong 发表于 2025-6-27 15:18 | 显示全部楼层
你看下是adc的第几个通道,然后照着其他几个通道的样子去搞不就好了
GalaxyStroll 发表于 2025-6-28 22:43 | 显示全部楼层
看版主的回复。还是ADC的配置通道不支持这样的跳跃的方式啊!
可能F003实在是太精简了吧
HarmonySage 发表于 2025-6-30 08:38 | 显示全部楼层
应该是没有配置好的吧,demo上有就是应该可以的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

15

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部