你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

F4三重ADC规则同时模式这样配置为什么不行啊

[复制链接]
zccdfafad 提问时间:2018-6-7 15:34 /
ADC_HandleTypeDef ADC1_Handler;//ADC句柄
ADC_HandleTypeDef ADC2_Handler;
ADC_HandleTypeDef ADC3_Handler;
ADC_MultiModeTypeDef multimode;
ADC_ChannelConfTypeDef ADC1_ChanConf,ADC2_ChanConf,ADC3_ChanConf;
DMA_HandleTypeDef ADC1DMA2;
DMA_HandleTypeDef ADC2DMA2;
DMA_HandleTypeDef ADC3DMA2;
//初始化ADC
//ch: ADC_channels
//通道值 0~16取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
void MY_ADC_Init_1(void)
{        
               
       
    ADC1_Handler.Instance=ADC1;
    ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频,ADCCLK=PCLK2/8=90/8=11.25MHZ
    ADC1_Handler.Init.Resolution=ADC_RESOLUTION_12B;             //12位模式
    ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;             //右对齐
    ADC1_Handler.Init.ScanConvMode=ENABLE;                      //非扫描模式
    ADC1_Handler.Init.EOCSelection=DISABLE;                      //开启EOC中断
    ADC1_Handler.Init.ContinuousConvMode=ENABLE;                //樟?
    ADC1_Handler.Init.NbrOfConversion=1;                         //1个转换在规则序列中 也就是只转换规则序列4
    ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;             //禁止不连续采样模式
    ADC1_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0
    ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START;       //软件触发
    ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发
    ADC1_Handler.Init.DMAContinuousRequests=ENABLE;             //DMA请求
               
    HAL_ADC_Init(&ADC1_Handler);                                 //初始化
       
                multimode.Mode =ADC_TRIPLEMODE_REGSIMULT;
//                multimode.DMAAccessMode=ADC_DMAACCESSMODE_1;
                multimode.TwoSamplingDelay=ADC_TWOSAMPLINGDELAY_5CYCLES;
                HAL_ADCEx_MultiModeConfigChannel(&ADC1_Handler, &multimode);
               
}


void MY_ADC_Init_2(void)
{
    ADC2_Handler.Instance=ADC2;
    ADC2_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频,ADCCLK=PCLK2/4=90/4=22.5MHZ
    ADC2_Handler.Init.Resolution=ADC_RESOLUTION_12B;             //12位模式
    ADC2_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;             //右对齐
    ADC2_Handler.Init.ScanConvMode=ENABLE;                      //非扫描模式
    ADC2_Handler.Init.EOCSelection=DISABLE;                      //关闭EOC中断
    ADC2_Handler.Init.ContinuousConvMode=ENABLE;                //关闭连续转换
    ADC2_Handler.Init.NbrOfConversion=1;                         //1个转换在规则序列中 也就是只转换规则序列1
    ADC2_Handler.Init.DiscontinuousConvMode=DISABLE;             //禁止不连续采样模式
    ADC2_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0
    ADC2_Handler.Init.ExternalTrigConv=ADC_EXTERNALTRIGCONV_T1_CC1;       //软件触发
    ADC2_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发
    ADC2_Handler.Init.DMAContinuousRequests=DISABLE;             //关闭DMA请求
               
    HAL_ADC_Init(&ADC2_Handler);                                 //初始化
       
                multimode.Mode =ADC_TRIPLEMODE_REGSIMULT;
                multimode.DMAAccessMode=ADC_DMAACCESSMODE_1;
        //        multimode.TwoSamplingDelay=ADC_TWOSAMPLINGDELAY_5CYCLES;
                HAL_ADCEx_MultiModeConfigChannel(&ADC2_Handler, &multimode);
}

void MY_ADC_Init_3(void)
{
    ADC3_Handler.Instance=ADC3;
    ADC3_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频,ADCCLK=PCLK2/4=90/4=22.5MHZ
    ADC3_Handler.Init.Resolution=ADC_RESOLUTION_12B;             //12位模式
    ADC3_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;             //右对齐
    ADC3_Handler.Init.ScanConvMode=ENABLE;                      //非扫描模式
    ADC3_Handler.Init.EOCSelection=DISABLE;                      //EOC中断
    ADC3_Handler.Init.ContinuousConvMode=ENABLE;                //连续转换
    ADC3_Handler.Init.NbrOfConversion=1;                         //1个转换在规则序列中 也就是只转换规则序列1
    ADC3_Handler.Init.DiscontinuousConvMode=DISABLE;             //禁止不连续采样模式
    ADC3_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0
    ADC3_Handler.Init.ExternalTrigConv=ADC_EXTERNALTRIGCONV_T1_CC1;       //软件触发
    ADC3_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发
    ADC3_Handler.Init.DMAContinuousRequests=DISABLE;             //关闭DMA请求
    HAL_ADC_Init(&ADC3_Handler);                                 //初始化
       
                multimode.Mode =ADC_TRIPLEMODE_REGSIMULT;
                multimode.DMAAccessMode=ADC_DMAACCESSMODE_1;
        //        multimode.TwoSamplingDelay=ADC_TWOSAMPLINGDELAY_5CYCLES;
                HAL_ADCEx_MultiModeConfigChannel(&ADC3_Handler, &multimode);
}
//ADC底层驱动,引脚配置,时钟使能
//此函数会被HAL_ADC_Init()调用
//hadc:ADC句柄
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_ADC1_CLK_ENABLE();            //使能ADC1时钟
                __HAL_RCC_ADC2_CLK_ENABLE();
                __HAL_RCC_ADC3_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();                        //开启GPIOA时钟
        //        __HAL_RCC_GPIOB_CLK_ENABLE();       
                __HAL_RCC_GPIOF_CLK_ENABLE();               
                __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能
       
    GPIO_Initure.Pin=GPIO_PIN_4|GPIO_PIN_5;    //|GPIO_PIN_6;            //PA5和PA4   PA4
    GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
    GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
                GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
               
                GPIO_Initure.Pin=GPIO_PIN_8;            //PF8
    GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
    GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
                GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOF,&GPIO_Initure);
       
                ADC1DMA2.Instance =DMA2_Stream0;
                ADC1DMA2.Init.Direction = DMA_PERIPH_TO_MEMORY;
                ADC1DMA2.Init.PeriphInc = DMA_PINC_DISABLE;
    ADC1DMA2.Init.MemInc = DMA_MINC_ENABLE;
    ADC1DMA2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    ADC1DMA2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    ADC1DMA2.Init.Mode = DMA_CIRCULAR;
    ADC1DMA2.Init.Priority = DMA_PRIORITY_HIGH;
                HAL_DMA_DeInit(&ADC1DMA2);
    HAL_DMA_Init(&ADC1DMA2);
    __HAL_LINKDMA(hadc,DMA_Handle,ADC1DMA2);
       
}


void MY_ADC1_ChanConf()   
{

          ADC1_ChanConf.Channel=ADC_CHANNEL_4;                                                //通道   PA4
    ADC1_ChanConf.Rank=1;                                       //第1个序列,序列1
    ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_3CYCLES;        //采样时间
    ADC1_ChanConf.Offset=0;                 
    HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置*/
       


}

void MY_ADC2_ChanConf()   
{
   ADC2_ChanConf.Channel=ADC_CHANNEL_5;                                                        //通道
   ADC2_ChanConf.Rank=1;                                       //第1个序列,序列1
   ADC2_ChanConf.SamplingTime=ADC_SAMPLETIME_3CYCLES;        //采样时间
   ADC2_ChanConf.Offset=0;                 
   HAL_ADC_ConfigChannel(&ADC2_Handler,&ADC2_ChanConf);        //通道配置
       

}
void MY_ADC3_ChanConf()   
{
   ADC3_ChanConf.Channel=ADC_CHANNEL_6;                                                        //通道
   ADC3_ChanConf.Rank=1;                                       //第1个序列,序列1
   ADC3_ChanConf.SamplingTime=ADC_SAMPLETIME_3CYCLES;        //采样时间
   ADC3_ChanConf.Offset=0;                 
   HAL_ADC_ConfigChannel(&ADC3_Handler,&ADC3_ChanConf);        //通道配置
       

}


收藏 评论2 发布时间:2018-6-7 15:34

举报

2个回答
lvwy0704 回答时间:2018-6-7 16:36:26
不懂 帮顶!
feixiang20 回答时间:2018-6-8 00:51:59
一时看不清,只能给你个参考【stm32f407的三重ADC同步触发模式配置】

1、在原有的电机控制算法中ADC双重同步模式(同时测量两相电流)下,增加一路测量线电压采样。

考虑到stm32f407有三个ADC,故配置ADC3来采样线电压,但是在实验过程会导致ADC12无法正常使用。

仔细分析:原来在ADC3配置会修改多个ADC的运行方式,双重模式下为ADC_DualMode_RegSimult,但假如ADC3配置后,独立模式ADC_Mode_Independent会使得之前ADC12配置的ADC_DualMode_RegSimult模式失败,从而导致AD12无法使用。因此,考虑利用stm32f407的三重模式来实现同时测量两相电流和线电压。

2、参考了STM32F4xx_StdPeriph_Examples中ADC的ADC_TripleModeInterleaved,为交替模式;为保证电机控制算法中电流为同步采样,应为同步模式;

之后参考STM32论坛的帖子:https://www.stmcu.org.cn/module/forum/thread-603974-1-2.html

3、具体实现:

其中在ADC配置中,有几个需要特别注意:

ADC_CommonInitStructure.ADC_Mode = ADC_TripleMode_RegSimult;//   三重同步模式
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//  4分频,84/4=21M<36M
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;//

//ADC_DMAAccessMode 模式的选择,参考手册,选择模式1



ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//
ADC_CommonInit(&ADC_CommonInitStructure);

以及以下资料参考

stm32f405/407的三重 ADC同步触发模式+DMA 配置

https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=603974&fromuid=2091055




评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版