• STM32 ADC DMA 中断模式多通道读取ADC转换值


    因为做一个电机控制项目,其中需要用到用PWM触发ADC,读取ADC的转换值。

    这里有两个关键问题:

    第一,如何使PWM触发ADC转换?

    第二,如何在ADC多通道扫描模式下,读取各个channel的adc转换值?

    第三,如何使用DMA读取多通道ADC转换值?

    第一个问题,首先需要将ADC设置成外部触发转换,第二需要选择触发是发生在Timer的上升沿还是下降沿。程序如下:

        adc.ADC_Resolution = ADC_Resolution_12b;        
        adc.ADC_ScanConvMode =ENABLE;     //¶àͨµÀת»»
        adc.ADC_ContinuousConvMode = ENABLE;   //Á¬Ðøת»»
        adc.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
        adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T8_CC1;
        adc.ADC_DataAlign = ADC_DataAlign_Right;  //ÓÒ¶ÔÆ뷽ʽ
        adc.ADC_NbrOfConversion = 2;
        ADC_Init(ADC1,&adc);
        ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_56Cycles);
        ADC_RegularChannelConfig(ADC1,ADC_Channel_2,2,ADC_SampleTime_56Cycles);
        ADC_Cmd(ADC1,ENABLE);
          //ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);   //ÉèÖô¥·¢ADCÖжϵÄÖжÏÔ´
        ADC_DMACmd(ADC1, ENABLE);
        ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);

    第二个问题,如果是使用ADC1的多个通道进行转换,那么使用DMA,使每个通道转换成功的数据存入响应的内存位置中,会是一个很好的选择,DMA选择外设到内存,外设地址不增加,内存地址增加。

    第三个问题,DMA的拓扑图如下,记得使用对应的DMA请求,需要设置好对应的DMAy、streamx和channelz,否则没法触发DMA中断。

    这里使用的是ADCDMA请求,选择了DMA2 stream0 channel0。 对应的DMA配置程序如下

    //配置
            DMA_DeInit(DMA2_Stream0);
        dma.DMA_Channel= DMA_Channel_0;   // 
        dma.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR);
        dma.DMA_Memory0BaseAddr = (uint32_t)ad_buffer;
        dma.DMA_DIR = DMA_DIR_PeripheralToMemory;
        dma.DMA_BufferSize = 2;
        dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
        dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//DMA_PeripheralDataSize_Byte;
        dma.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//DMA_MemoryDataSize_Byte;
        dma.DMA_Mode = DMA_Mode_Circular;
        dma.DMA_Priority = DMA_Priority_High;
        dma.DMA_FIFOMode = DMA_FIFOMode_Disable;
        dma.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
        dma.DMA_MemoryBurst = DMA_Mode_Normal;
        dma.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
        DMA_Init(DMA2_Stream0,&dma);
    
        DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE);
        DMA_Cmd(DMA2_Stream0,ENABLE);
  • 相关阅读:
    查询同一表格中姓名相同但身份证号不同的记录
    Liunx常用命令
    判断当前移动端是Android、还是ios、还是微信
    mybatis 返回值问题
    log4j2+mybaits 打印sql操作语句
    java日期格式问题
    eachart图表100px大小原因,及处理办法
    springboot中的默认数据库连接池HikariDataSource
    SpringBoot中logback.xml使用application.yml中属性
    linux 下的vi vim快捷键,命令总结
  • 原文地址:https://www.cnblogs.com/wll-zju/p/4638906.html
Copyright © 2020-2023  润新知