[活动专区] 【AT-START-F407测评】双重adc(貌似发现at的bug)

[复制链接]
 楼主| Ben666 发表于 2021-2-15 20:00 | 显示全部楼层 |阅读模式
对at的双重adc进行测试本来打算一上午解决的,结果弄了三天,adc+dma一直有问题,最后发现自己的果然是自己菜把函数写错了,但是改正之后依旧不正常,最后发现在程序跑飞了
先来简单的讲解一下双重adc
at有 2 个或以上 ADC 模块的产品中,可以使用双 ADC 模式,双重adc模式包括:
─ 同步注入模式

─ 同步规则模式
─ 快速交叉模式

─ 慢速交叉模式

─ 交替触发模式

─ 独立模式
还有可以用下列方式组合使用上面的模式:
─ 同步注入模式 + 同步规则模式

─ 同步规则模式 + 交替触发模式

─ 同步注入模式 + 交叉模式

同时双重模式一般速率太快必须使用dma(注:只有 ADC1 和 ADC3 拥有 DMA 功能。由 ADC2 转化的数据可以通过双 ADC 模式,利用 ADC1 的 DMA 功能传输。)
本人使用的双重adc快速交叉模式 (每个模式对应的图不同,请自行查询手册)

adc.png
at的ADC 的输入时钟不得超过 28 MHz,将采样速度开到1.5clk时,adc速率高达2M,如果再配合双重模式那是相当的nice
但在我以前stm32的代码移植到at上时,程序一直出现问题,串口根本不输出任何数据
结果仿真后发现他凉在了

Inked位置_LI.jpg
然后在网上查阅了大量资料以后依然没有解决,程序已经被改的乱七八糟。最后我干脆将两个adc的校验直接删除后,一切都正常的,当时我就自闭了,然后通过不断修改发现将adc1的开启校验放在adc2的复位校准后代码居然正常了(单纯在初始化后加延时不起作用)
我又重新对stm32的程序进行检测,发现一样程序at32有问题的地方stm32没有,将stm32的程序下载到at32中(大部分程序都可以)也出现了的问题。
同时说一下其它一些重要问题,网上很多朋友遇到的。
要想开启双重模式必须要开启adc2的触发源     ADC_ExternalTrigConvCtrl(ADC2, ENABLE);
暂时粘贴部分代码,文件被修改的比较乱,后面整理后上传
  1.         ADC_InitType ADC_InitStructure;
  2.        
  3.         RCC_APB2PeriphClockCmd(Adc1_Clk|Adc2_Clk, ENABLE );          //ʹÄÜADC1ͨµÀʱÖÓ
  4.         ADC_Reset(ADC1);  //¸´Î»ADC1,½«ÍâÉè ADC1 µÄÈ«²¿¼Ä´æÆ÷ÖØÉèΪȱʡֵ
  5.         ADC_Reset(ADC2);  
  6.        
  7.         ADC_InitStructure.ADC_Mode           = ADC_Mode_FastInterl;
  8.         ADC_InitStructure.ADC_ScanMode       = DISABLE;
  9.         ADC_InitStructure.ADC_ContinuousMode = ENABLE;
  10.         ADC_InitStructure.ADC_ExternalTrig   = ADC_ExternalTrig_None;
  11.         ADC_InitStructure.ADC_DataAlign      = ADC_DataAlign_Right;
  12.         ADC_InitStructure.ADC_NumOfChannel   = 1;
  13.         ADC_Init(ADC1, &ADC_InitStructure);

  14.         //ADC1 regular channel14 configuration
  15.         ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1_5);

  16.         //Enable ADC1 DMA
  17.         ADC_DMACtrl(ADC1, ENABLE);

  18.         //ADC2 configuration
  19.         ADC_InitStructure.ADC_Mode = ADC_Mode_FastInterl;
  20.         ADC_InitStructure.ADC_ScanMode = DISABLE;
  21.         ADC_InitStructure.ADC_ContinuousMode = ENABLE;
  22.         ADC_InitStructure.ADC_ExternalTrig = ADC_ExternalTrig_None;
  23.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  24.         ADC_InitStructure.ADC_NumOfChannel = 1;
  25.         ADC_Init(ADC2, &ADC_InitStructure);

  26.         //ADC2 regular channel14 configuration
  27.         ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 1, ADC_SampleTime_1_5);

  28.         ADC_ExternalTrigConvCtrl(ADC2, ENABLE);

  29.         //Enable ADC1
  30.         ADC_Ctrl(ADC1, ENABLE);
  31.        
  32.         //Enable ADC1 reset calibaration register
  33.         ADC_RstCalibration(ADC1);
  34.         //Check the end of ADC1 reset calibration register
  35.         while(ADC_GetResetCalibrationStatus(ADC1));

  36. //        //Enable ADC2
  37.         ADC_Ctrl(ADC2, ENABLE);

  38.         //Enable ADC2 reset calibaration register
  39.         ADC_RstCalibration(ADC2);
  40.         //Check the end of ADC2 reset calibration register
  41.         while(ADC_GetResetCalibrationStatus(ADC2));
  42.        
  43.         //Start ADC1 calibaration
  44.         ADC_StartCalibration(ADC1);
  45.         //Check the end of ADC1 calibration
  46.         while(ADC_GetCalibrationStatus(ADC1));

  47.         //Start ADC2 calibaration
  48.         ADC_StartCalibration(ADC2);
  49.         //Check the end of ADC2 calibration
  50.         while(ADC_GetCalibrationStatus(ADC2));

  51.         //Start ADC1 Software Conversion
  52.         ADC_SoftwareStartConvCtrl(ADC1, ENABLE);
  53.         ADC_SoftwareStartConvCtrl(ADC2, ENABLE);






muyichuan2012 发表于 2021-2-18 10:24 | 显示全部楼层
您好,这应该是遇到403A与ST的区别。st103到AT32F403a的MG上有描述。
地址如下:http://www.arterytek.com/downloa ... T32F403A_V1.0.6.pdf

adc3.png

 楼主| Ben666 发表于 2021-2-18 13:25 | 显示全部楼层
muyichuan2012 发表于 2021-2-18 10:24
您好,这应该是遇到403A与ST的区别。st103到AT32F403a的MG上有描述。
地址如下:http://www.arterytek.com/ ...

的确是,感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

11

帖子

0

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