打印
[APM32F0]

APM32F035系列 DMA-ADC采样,ADC异常不动作

[复制链接]
797|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
question0303|  楼主 | 2023-10-30 14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    在使用APM32F035来做电机应用时,虽然APM32F035和APM32F030都属于Arm-Cortex-M0+内核,但是在ADC采样方式部分还是有一些区别的,以下针对问题以及性能做简单阐述。

    案例:在应用ADC-DMA进行采样时,在DMA采样完成中断内,切换ADC通道,再配置DMA开启新的采样,在若干次后,出现ADC不动作情况。
     中断处理如下:
     void DMA_CH1_IRQHandler(void)



     {
      static u32 L_Adc_Channe1Temp
      DMA->INTFCLR |= DMA_FLAG_TF1;
      if(SampletestState == SAMPLE_1) // 当前采样的是电流
          {
             SampletestState = NOR SAMPLE // 普通采样
             ADC->CTRL B.ADCEN = 0; DMA CHANNEL 1->CHCFG B.CHEN=0 //关闭DMA通道1_
             DMA_CHANNEL_1->CHNDATA =ADC1ResultNum; // 平均
             DMA_CHANNEL_1->CHMADDR = (u32)ADC1Resu1lt_Table; // 指定DMA的内存目标地址
             Adc Channe1Temp =ADC->CHSEL:
             ADC->CHSEL = IAVR_CURRENT_CHANNEL |VC_VOLTAGE_CHANNEL|VA_VOLTAGE_CHANNEL|VB_VOLTAGE_CHANNEL |VOLTAGE_CHAI
             ADC->CFG1_B.EXTPOLSEL1= ADC_EXT_TRIG_EDGE_NONE; //指定外音
             DMA_CHANNEL_1->CHCFG_B.CHEN =1; // 使能DMA通道1
             ADC->CTRL_B.ADCEN = 1; // 使能ADC
             ADC->CTRL_B.STARTCEN = 1; // 置ADSTART标志,
          }
        // 当前采样的是反电
     else{
          SampleState = CUR SAMPLE // 电流采样
          ADC->CTRL B.ADCEN = 0; // 关闭ADC
          DMA CHANNEL 1->CHCFG B.CHEN = 0; // 关闭DMA通道1
          DMA CHANNEL 1->CHNDATA= 2: // 平均电流基准需要
          DMA_CHANNEL_1->CHMADDR = (u32)ADC1CurResult_Table // 指定DMA的内存目
          ADC->CHSEL = L_Adc_Channe1Temp: // 只采峰值电流通道
          ADC->CFG1_B.EXTPOLSEL1= ADC_EXT_TRIG _EDGE _RISING: //指定外音
          DMA_CHANNEL_1->CHCFG_B.CHEN = 1; // 使能DMA通道1
          ADC->CTRL_B.ADCEN = 1; // 使能ADC
          ADC->CTRL_B.STARTCEN = 1; // 置ADSTAI
         }
     }




    问题点:由于多次切换问题,可能会存在软件端使能了ADC,但是ADC硬件并未准备好,ADC就开始采样时,导致ADC溢出挂掉。
    改进点:在切换ADC失能,并失能后,加入判断ADC是否已经准备好的判定条件。
                while(ADC->STS_B.ADCRDY** !=1){};  可以在ADCEN后判断下ADC状态。


    ADC分段采样模式区别:
    断续模式---APM32F030x6x8
    配置寄存器 ADC_CFG1 的 DISCEN 位置 1, ADC 设置为断续模式;通过软件或硬件的触发事件开启 ADC 转换。该模式下每次只转换一个序列中的一个通道,
    若 DISCEN 位清零,则每次转换一个序列的所有通道。
    例如:
  • DISCEN 位置 1,通道序列为 0,1,5

    - 1st 触发,通道 0 被转换并且产生一个 EOC** 事件
    - 2nd 触发,通道 1 被转换并且产生一个 EOC** 事件
    - 3rd 触发,通道 5 被转换并且产生一个 EOC** 事件
  • DISCEN 位为 0,通道序列为 0,1,5

    - 1st 触发,通道 0,1,5 按顺序依次被转换,每个通道转换完产生一个
    EOC** 事件,整个序列转换完成后产生一个 EOSEQ** 事件

     序列分段模式---APM32F035x8
    数据对齐方式为左对齐或右对齐,配置寄存器 ADC_CFG1 的 DALIGCFG 位决定, DALIGCFG 为 0 右对齐, DALIGCFG 为 1 左对齐。 ADC 转换结果可以左对齐或右对齐存储在 16 位数据寄存器中。序列分段采样模式的数据存储在 ADC_DATA(0-18)的寄存器,可左右对齐。
    例如:配置 3 段序列采样,第一段通道总数为 1(采样通道 0),第二段通道总数为 2(采样通道 1, 0),第三段通道总数为 3(采样通道 2, 3, 1),(配置
    ADC_SEQ_NUM = 0x20000820; ADC_CHANNEL1.CH0=0;
    ADC_CHANNEL1.CH1=1, ADC_CHANNEL1.CH2=0

    ADC_CHANNEL1.CH3=2, ADC_CHANNEL1.CH4=3,
    ADC_CHANNEL1.CH5=1),则第一段的数据结果将出现在 ADC_DATA0, 第二段的数据结果将出现在 ADC_DATA1-2, 第三段的数据结果将出现在
    ADC_DATA3-5,虽然 ADC 分段采样模式支持乱序(即第二、三段采样可先于第一段),但每段对应的结果寄存器的对应关系是固定的(例如,配置完成后开启
    ADC,若 ADC 首先接收第三段采样对应的硬件触发,则该段采样结束后模拟通道 2 的结果将出现在 ADC_DATA3,模拟通道 3 的结果将出现在 ADC_DATA3,
    模拟通道 1 的结果将出现在 ADC_DATA5)。


    这两种模式,区别在于断续模式只支持每个序列采样一个通道,且存在在同一个Data寄存器内,以防止数据被覆盖需要快速读取。而序列分段模式,支持每个序列多个通道采样,且对应不同的序列都会存放在对应通道的Data寄存器内,方便用到后在读取,对于电机应用较为便利。


   
   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:极海半导体
简介:珠海极海半导体有限公司是一家致力于开发工业级/车规级微控制器、模拟与混合信号IC及系统级芯片的集成电路设计型企业。极海团队拥有20年集成电路设计经验和嵌入式系统开发能力,可为客户提供核心可靠的芯片产品及方案,实现准确感应、安全传输和实时控制,助力客户在智慧家居、高端消费电子、工业控制、汽车电子、智慧能源以及通信设施等领域的拓展创新。

5

主题

8

帖子

0

粉丝