跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YTM32B1M系列
  4. YTM32B1ME05 ADC不稳问题

YTM32B1ME05 ADC不稳问题

已定时 已固定 已锁定 已移动 YTM32B1M系列
16 帖子 4 发布者 266 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • quanfengQ 离线
    quanfengQ 离线
    quanfeng YunTu
    编写于 最后由 编辑
    #5

    您可以在官网上下载 ME05 的应用审查清单,有 ADC FIFO 错乱的说明和规避方案

    9935bfff-e812-4ad3-8747-6d0f27a05214-image.png

    image.png

    ADC FIFO 错乱帖子链接如下:
    https://forum.ytmicro.com/topic/1058/md1_adc测试到fifo错位问题

    OliverChenO 2 条回复 最后回复
    0
    • OliverChenO 离线
      OliverChenO 离线
      OliverChen
      回复了quanfeng 最后由 编辑
      #6

      quanfeng 我使用的硬件触发,然后只打开了EOS中断,在中断中执行,也会出现这种情况吗?

      1 条回复 最后回复
      0
      • OliverChenO 离线
        OliverChenO 离线
        OliverChen
        编写于 最后由 编辑
        #7

        在ADC中断中每次读8次FIFO可以解决

        1 条回复 最后回复
        0
        • OliverChenO 离线
          OliverChenO 离线
          OliverChen
          回复了quanfeng 最后由 编辑
          #8

          quanfeng 忘记说了,下午重新验证了下,发现并没有通道错位情况,数据还是一样波动比较大。

          代码如下:

          /**
           * @brief ADC0 interrupt handler
           * @return none
           */
          void ADC0_IRQHandler(void)
          {
              uint32_t adcSampleSum = 0U;
              uint8_t expectedChannel = adcInst[UserAdcParams.pwmIndex][1];
              uint8_t validCnt = 0U;
          
              ADC_DRV_ClearEoseqFlagCmd(0);
              adcSampleSum = 0U;
          
          	for(uint8_t readCnt = 0U; readCnt < 8U; readCnt++) {
                  adcSampleResult[readCnt].u32DualWord = ADC0->FIFO;
                  if(readCnt < 4U)
                  {
                      if(adcSampleResult[readCnt].parts.u16ChnIndex == expectedChannel) {
                          adcSampleSum += adcSampleResult[readCnt].parts.u16ChnResult;
                          validCnt++;
                      } else {
                          misMatchFlag = true;
                      }
                  }
          
              }
          
              if (validCnt > 0U) {
                  updateAdcResult((uint16_t)(adcSampleSum / validCnt));
              } else {
                  updateAdcResult(0x8000);
              }
          
              
              if(adcSampleResult[4].parts.u16ChnIndex == ADC_INPUTCHAN_EXT17) {
                  UserAdcParams.boardSupplyVolt.rawAdcValue = adcSampleResult[4].parts.u16ChnResult;
              }else{
                  misMatchFlag = true;
              }
              if(adcSampleResult[5].parts.u16ChnIndex == ADC_INPUTCHAN_EXT18) {
                  UserAdcParams.ledSupplyVolt.rawAdcValue = adcSampleResult[5].parts.u16ChnResult;
              }else{
                  misMatchFlag = true;
              }
          }
          
          /**
           * @brief ADC1 interrupt handler
           * @return none
           */
          void ADC1_IRQHandler(void)
          {
              uint32_t adcSampleSum = 0U;
              uint8_t expectedChannel = adcInst[UserAdcParams.pwmIndex][1];
              uint8_t validCnt = 0U;
          
              ADC_DRV_ClearEoseqFlagCmd(1);
              for(uint8_t readCnt = 0U; readCnt < 8U; readCnt++) {
                  adcSampleResult[readCnt].u32DualWord = ADC1->FIFO;
                  if(readCnt < 4U){
                      if(adcSampleResult[readCnt].parts.u16ChnIndex == expectedChannel) {
                          adcSampleSum += adcSampleResult[readCnt].parts.u16ChnResult;
                          validCnt++;
                      } else {
                          misMatchFlag = true;
                      } 
                  }
              }
              if (validCnt > 0U) {
                  updateAdcResult((uint16_t)(adcSampleSum / validCnt));
              } else {
                  updateAdcResult(0x8000);
              }
          }
          
          

          进不到misMatchFlag 为true情况,采集到的数据波动比较大。
          b128dfb3-a1d3-4a43-bd30-8404cc65697f-image.png

          1 条回复 最后回复
          0
          • DigaD 离线
            DigaD 离线
            Diga
            编写于 最后由 编辑
            #9

            ADC 的配置是什么,贴一个

            OliverChenO 1 条回复 最后回复
            0
            • OliverChenO 离线
              OliverChenO 离线
              OliverChen
              回复了Diga 最后由 编辑
              #10

              Diga

              ADC0

              4fc6015a-c393-44d1-ae03-ea88a09ca89a-image.png

              ADC1

              fd74665d-107a-4261-bf91-188362449f62-image.png

              1 条回复 最后回复
              0
              • DigaD 离线
                DigaD 离线
                Diga
                编写于 最后由 编辑
                #11

                先这样试试,你把俩序列的所有通道配成同一个,然后切换配置的时候不要修改通道,只切换 Trigger,看一下结果

                OliverChenO 1 条回复 最后回复
                0
                • OliverChenO 离线
                  OliverChenO 离线
                  OliverChen
                  回复了Diga 最后由 编辑
                  #12

                  Diga

                  ADC0配置:

                  272a9caa-ba0c-4dec-83e0-d88d87a64219-image.png

                  ADC1配置

                  5e668428-4f6e-483d-9d8c-bdad26673548-image.png


                  代码

                  void user_adc_start_conversion(void)
                  {
                  	tmu_target_module_t targetModule = TMU_TARGET_MODULE_ADC1_EXT_TRIG;
                  	
                  	/* Configure ADC channel selection based on PWM index */
                  	if(adcInst[UserAdcParams.pwmIndex][0] == ADC1_INST) {
                  //		ADC1->CHSEL[0] = adcInst[UserAdcParams.pwmIndex][1];
                  //        ADC1->CHSEL[1] = adcInst[UserAdcParams.pwmIndex][1];
                  //        ADC1->CHSEL[2] = adcInst[UserAdcParams.pwmIndex][1];
                  //        ADC1->CHSEL[3] = adcInst[UserAdcParams.pwmIndex][1];
                  		targetModule = TMU_TARGET_MODULE_ADC1_EXT_TRIG;
                  	} else {
                  //		ADC0->CHSEL[0] = adcInst[UserAdcParams.pwmIndex][1];
                  //        ADC0->CHSEL[1] = adcInst[UserAdcParams.pwmIndex][1];
                  //        ADC0->CHSEL[2] = adcInst[UserAdcParams.pwmIndex][1];
                  //        ADC0->CHSEL[3] = adcInst[UserAdcParams.pwmIndex][1];
                  		targetModule = TMU_TARGET_MODULE_ADC0_EXT_TRIG;
                  	}
                  	
                  	/* Update TMU target module directly without reinitializing entire TMU
                  	 * This is more efficient than TMU_DRV_Init which resets all target modules
                  	 */
                      TMU->MUX[3] = 0;
                      TMU->MUX[4] = 0;
                      TMU_SetTrigSourceForTargetModule(TMU, TMU_TRIG_SOURCE_eTMR0_EXT_TRIG, targetModule);
                  }
                  
                  

                  结果如下
                  a69d9aba-5bfe-4fd4-9713-74c0a8eb7de2-image.png

                  1 条回复 最后回复
                  0
                  • DigaD 离线
                    DigaD 离线
                    Diga
                    编写于 最后由 编辑
                    #13

                    你的这个结果是什么意思?ADC0 的 CH11?or ADC1 的 CH17?或者两者都有?
                    另外这两个通道的理想结果应该是多少

                    OliverChenO 1 条回复 最后回复
                    0
                    • OliverChenO 离线
                      OliverChenO 离线
                      OliverChen
                      回复了Diga 最后由 编辑
                      #14

                      Diga 不好意思,两者都有,所以看起来波动很大,这里我重新测了下,不切换的情况下很稳定上边这个是ADC1下边是ADC0,基本误差不差10

                      40b7e59b-6adf-4cb5-9c15-e1de134f3104-image.png

                      1 条回复 最后回复
                      0
                      • DigaD 离线
                        DigaD 离线
                        Diga
                        编写于 最后由 编辑
                        #15

                        看起来你上一张图的下限 2900 应该是 ADC0 CH11 的结果,上限 3281 应该是 ADC1 CH17 的结果。那这两个通道的电压不一样,采样的结果不一样,不是一件正常的事嘛?

                        要证明在跳,得把两个结果区分出来

                        OliverChenO 1 条回复 最后回复
                        0
                        • OliverChenO 离线
                          OliverChenO 离线
                          OliverChen
                          回复了Diga 最后由 编辑
                          #16

                          Diga 理解你的意思了,我再试试

                          1 条回复 最后回复
                          0

                        • 云途开发生态介绍

                          快速上手云途开发生态

                        • 云途论坛规则/Yuntu Forum Rules

                          发帖前请查看

                        • YT CONFIG TOOL调查问卷

                          帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

                        • can
                          22
                          demo
                          20
                          uds
                          13
                          lin stack
                          11
                          md14
                          6
                          fbl
                          5
                          yt-link
                          5
                          adc模块
                          4
                          Online Users
                          orangejayccO
                          orangejaycc
                          WRW
                          WR
                          LlllllL
                          Llllll
                          • 登录

                          • 登录或注册以进行搜索。
                          • 第一个帖子
                            最后一个帖子
                          0
                          • 版块
                          • 最新
                          • 标签
                          • 热门