sos博 发表于 2018-10-7 14:13:52

求HAL+ADC+DMA多路采集完整例程。

我板子F407VG
在网上找教程,都是怎么配置,我按着差不多配置完了,不知道怎么获取值,怎么得到结果。
下面放上我自己配置的,给大家看看有毛病不。

<p>ADC_ChannelConfTypeDef sConfig;
ADC_MultiModeTypeDef multimode;
   
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;//精度12bit
hadc1.Init.ScanConvMode = ENABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_CC1;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;//数据右对齐
hadc1.Init.NbrOfConversion = 8;//顺序转换8个通道的ADC值
hadc1.Init.DMAContinuousRequests = ENABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
    _Error_Handler(__FILE__, __LINE__);
}

multimode.Mode = ADC_MODE_INDEPENDENT;
if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
{
    Error_Handler();
}
</p><p>
</p><p>sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{_Error_Handler(__FILE__, __LINE__);}
        sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = 2;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{_Error_Handler(__FILE__, __LINE__);}
        sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = 3;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{_Error_Handler(__FILE__, __LINE__);}
        sConfig.Channel = ADC_CHANNEL_3;
sConfig.Rank = 4;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{_Error_Handler(__FILE__, __LINE__);}
        sConfig.Channel = ADC_CHANNEL_4;
sConfig.Rank = 5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{_Error_Handler(__FILE__, __LINE__);}
        sConfig.Channel = ADC_CHANNEL_5;
sConfig.Rank = 6;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{_Error_Handler(__FILE__, __LINE__);}
        sConfig.Channel = ADC_CHANNEL_6;
sConfig.Rank = 7;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{_Error_Handler(__FILE__, __LINE__);}
        sConfig.Channel = ADC_CHANNEL_7;
sConfig.Rank = 8;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{_Error_Handler(__FILE__, __LINE__);}</p><p>
</p><p>下面是GPIO的配置我没放。</p>

tgw860910 发表于 2018-10-8 09:20:30

你用的是DMA吧?那就要打开DMA的转换,函数应该是这个 HAL_ADC_Start_DMA

wenyangzeng 发表于 2018-10-8 09:59:18

ST官方就有代码可参考:


sos博 发表于 2018-10-9 09:04:01

tgw860910 发表于 2018-10-8 09:20
你用的是DMA吧?那就要打开DMA的转换,函数应该是这个 HAL_ADC_Start_DMA

哦,那个函数我看到了,也用了,但是返回来的是0。。。。
并且不知道多路的怎么获取,难道定义个数组?然后传入数组名和长度?我试了,也是0.

sos博 发表于 2018-10-9 09:04:54

wenyangzeng 发表于 2018-10-8 09:59
ST官方就有代码可参考:

那个我看了,没有帮助啊,那个函数我用了,返回0.请看楼上我的描述。

wenyangzeng 发表于 2018-10-9 10:24:08

sos博 发表于 2018-10-9 09:04
那个我看了,没有帮助啊,那个函数我用了,返回0.请看楼上我的描述。

ST官方例程一定没问题的,楼主应该检查一下自己的硬件了。

tgw860910 发表于 2018-10-9 13:54:35

        HAL_ADC_Start_DMA(&hadc1, (uint32_t*)Adcc_Val, ADCC_Channel_Max);

就是这样用啊,定义一个 Adcc_Val 的数组,你在配置ADC的时候用了多少个RANK,这些AD值就会循环地写入这个数组,还有一个要注意的是,你在初始化配置的时候用的是TIM3 CH1的触发,你还得看看TIM3 CH1有没有工作,我建议你改成 hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;

butterflyspring 发表于 2018-10-9 17:14:53

多路只能一个个去获取,而且要注意间隔时间

absdjko 发表于 2018-11-10 08:42:26

感觉407的AD用、。。。。

absdjko 发表于 2018-11-10 08:49:00

wenyangzeng 发表于 2018-10-8 09:59
ST官方就有代码可参考:

单通道的啊,问题是多通道就有问题了
页: [1] 2
查看完整版本: 求HAL+ADC+DMA多路采集完整例程。