硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4633|回复: 25
收起左侧

[ADC] STM32H7的ADC可以做三ADC快速交替采样,16bit分辨率是10.5Msps,14bit是15Msps,8bit是25Msps

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106544
QQ
发表于 2020-4-17 10:55:01 | 显示全部楼层 |阅读模式
注意这个帖子的问题:

STM32H7中ADC功能被ST玩出花,现在分直接通道,快速通道和慢速通道,不同封装最高速不同, LQFP封装速度最低
http://www.armbbs.cn/forum.php?mod=viewthread&tid=97343



QQ截图20200417105705.png




回复

使用道具 举报

22

主题

250

回帖

321

积分

高级会员

积分
321
发表于 2020-4-17 11:29:57 | 显示全部楼层
期待H7的示波器版本。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106544
QQ
 楼主| 发表于 2020-4-18 09:16:21 | 显示全部楼层
wujialing3000 发表于 2020-4-17 11:29
期待H7的示波器版本。

努力,抓紧恢复H7-TOOL的RTX5全家桶版制作。
回复

使用道具 举报

22

主题

250

回帖

321

积分

高级会员

积分
321
发表于 2020-4-18 10:38:09 | 显示全部楼层
eric2013 发表于 2020-4-18 09:16
努力,抓紧恢复H7-TOOL的RTX5全家桶版制作。

辛苦辛苦
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2020-4-18 10:47:24 | 显示全部楼层
eric2013 发表于 2020-4-18 09:16
努力,抓紧恢复H7-TOOL的RTX5全家桶版制作。

你好 请问下V7后面会出H750芯片的核心板么?或者双核的CPU
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106544
QQ
 楼主| 发表于 2020-4-18 11:16:10 | 显示全部楼层
zh9454 发表于 2020-4-18 10:47
你好 请问下V7后面会出H750芯片的核心板么?或者双核的CPU

H750有H7-TOOL了,应该不会出单独板子。

双核还不知道呢。
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2020-4-18 11:36:21 | 显示全部楼层
eric2013 发表于 2020-4-18 11:16
H750有H7-TOOL了,应该不会出单独板子。

双核还不知道呢。

好的 谢谢硬汉哥
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2020-4-22 11:09:11 | 显示全部楼层
请问 原来说不支持 现在支持三ADC交替采样  是软件版本升级了吗? 有没有相应的例程供参考  谢谢
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2020-4-22 11:11:05 | 显示全部楼层
请问 原来不支持  现在支持3ADC交替采样 是HAL库 版本更新了吗?  会有相应的例程吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106544
QQ
 楼主| 发表于 2020-4-22 15:11:53 | 显示全部楼层
huajin 发表于 2020-4-22 11:11
请问 原来不支持  现在支持3ADC交替采样 是HAL库 版本更新了吗?  会有相应的例程吗?

做,整三代示波器的时候会做专门的测评。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2020-5-1 19:59:13 | 显示全部楼层
确实很快了,这都可以做2M带宽示波器了
回复

使用道具 举报

2

主题

17

回帖

23

积分

新手上路

积分
23
发表于 2020-5-9 14:21:08 | 显示全部楼层
本帖最后由 啃瓜子的猫 于 2020-5-9 16:07 编辑

硬汉哥,我用H7的ADC+DMA采集,我采集两个通道的ADC,
HAL_ADC_Start_DMA(&ADC1_Handler,SendBuf,1);这个函数只要最后一个参数大于1,我程序有看门狗,就会不断的喂狗。。我调试好像是可以进中断,不知道是不是一直中断。参数是1的时候,是没有问题的。
我的SendBuf参数是ALIGN_32BYTES (volatile uint32_t SendBuf[2]);

中断函数。
void  DMA1_Stream1_IRQHandler(void)
{
           ubADCDualConversionComplete = SET;
                __HAL_DMA_CLEAR_FLAG(&DMAx_Handler,DMA_FLAG_TCIF1_5);
         // __HAL_DMA_CLEAR_FLAG(&DMAx_Handler,DMA_FLAG_TCIF1_5|DMA_FLAG_TCIF0_4|DMA_FLAG_TCIF2_6|DMA_FLAG_TCIF3_7);
        
        //由于STM32H7 Cache的存在,凡是CPU和DMA都会操作到的存储器,
        //我们都要注意数据一致性问题。对于本章节要实现的功能,要注意读Cache问题,防止DMA已经更新了缓冲区的数据,而我们读取的却是Cache里面缓存的
         
        
         // NormalLoop();
}
ADC的配置和DMA的配置
void ADC_DMA_Init(ADC_HandleTypeDef* hadc)
{
        //DMA_HandleTypeDef  DMAx_Handler;
       
        if(hadc->Instance == ADC1)
        {
                __HAL_RCC_DMA1_CLK_ENABLE();
               
                DMAx_Handler.Instance = DMA1_Stream1;

    DMAx_Handler.Init.Request             = DMA_REQUEST_ADC1;
    DMAx_Handler.Init.Direction           = DMA_PERIPH_TO_MEMORY;
    DMAx_Handler.Init.PeriphInc           = DMA_PINC_DISABLE;
    DMAx_Handler.Init.MemInc              = DMA_MINC_ENABLE;
    DMAx_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;       /* Transfer from ADC by word to match with ADC configuration: Dual mode, ADC master contains conversion results on data register (32 bits) of ADC master and ADC slave  */
    DMAx_Handler.Init.MemDataAlignment    = DMA_PDATAALIGN_WORD;       /* Transfer to memory by word to match with buffer variable type: word */
    DMAx_Handler.Init.Mode                = DMA_CIRCULAR;              /* DMA in circular mode to match with ADC configuration: DMA continuous requests */
    DMAx_Handler.Init.Priority            = DMA_PRIORITY_HIGH;
               
                //////////////////////////////////////////////////////////////////
       DMAx_Handler.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;    /* 禁止FIFO*/
        DMAx_Handler.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL; /* 禁止FIFO此位不起作用,用于设置阀值 */
        DMAx_Handler.Init.MemBurst            = DMA_MBURST_SINGLE;       /* 禁止FIFO此位不起作用,用于存储器突发 */
        DMAx_Handler.Init.PeriphBurst         = DMA_PBURST_SINGLE;       /* 禁止FIFO此位不起作用,用于外设突发 */
    // Deinitialize  & Initialize the DMA for new transfer
    HAL_DMA_DeInit(&DMAx_Handler);
    HAL_DMA_Init(&DMAx_Handler);

    // Associate the initialized DMA handle to the ADC handle */
    __HAL_LINKDMA(hadc, DMA_Handle, DMAx_Handler);

    // NVIC configuration for DMA interrupt (transfer completion or error)
    // Priority: high-priority
   HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 1, 0);
    HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
        }
void ADC_Init(ADC_TypeDef *ADCx)
{
        if(ADCx == ADC1)
        {
                ADC1_Handler.Instance                                                                                                =        ADC1;
                ADC1_Handler.Init.ClockPrescaler                                                =        ADC_CLOCK_ASYNC_DIV2; //4分频,ADCCLK=PER_CK/2=64/2=32MHZ
                ADC1_Handler.Init.Resolution                                                                =        ADC_RESOLUTION_16B;       //16位模式
               
                 #if  defined(ADC_DMA)
           ADC1_Handler.Init.ScanConvMode                                                        =        ADC_SCAN_ENABLE;                  //非扫描模式       
          #else
          ADC1_Handler.Init.ScanConvMode                                                        =        DISABLE;                  //非扫描模式
               
   #endif
               
                ADC1_Handler.Init.EOCSelection                                                        =        ADC_EOC_SINGLE_CONV;      //关闭EOC中断
                ADC1_Handler.Init.LowPowerAutoWait                                        =        DISABLE;                                                                        //自动低功耗关闭                               
                //ADC1_Handler.Init.BoostMode=ENABLE;                                                                               //BOOT模式关闭
        //        ADC1_Handler.Init.DMA
                #if defined(ADC1_TRIGGER_FROM_TIMER)
                        ADC1_Handler.Init.ContinuousConvMode            = DISABLE;                                                       //关闭连续转换,Continuous mode disabled to have only 1 conversion at each conversion trig
                #else
                        ADC1_Handler.Init.ContinuousConvMode      = DISABLE;                   // Continuous mode to have maximum conversion speed (no delay between conversions)
                #endif
               
        #if  defined(ADC_DMA)
            ADC1_Handler.Init.ContinuousConvMode      = ENABLE;                   // Continuous mode to have maximum conversion speed (no delay between conversions)
        #else
            ADC1_Handler.Init.ContinuousConvMode      = DISABLE;                   // Continuous mode to have maximum conversion speed (no delay between conversions)
               
   #endif
                 
                ADC1_Handler.Init.NbrOfConversion                                                =        2;                        //1个转换在规则序列中 也就是只转换规则序列1
                ADC1_Handler.Init.DiscontinuousConvMode                        =        DISABLE;                                    //禁止不连续采样模式
                ADC1_Handler.Init.NbrOfDiscConversion                                =        0;                                    //不连续采样通道数为0
         
                #if defined(ADC1_TRIGGER_FROM_TIMER)
                        ADC1_Handler.Init.ExternalTrigConv        = ADC1_TRIGEER_TRGO; //Timer 15 external event triggering the conversion
                        ADC1_Handler.Init.ExternalTrigConvEdge    = ADC_EXTERNALTRIGCONVEDGE_RISING;
                #else
                        ADC1_Handler.Init.ExternalTrigConv        = ADC_SOFTWARE_START;       //软件触发
                        ADC1_Handler.Init.ExternalTrigConvEdge    = ADC_EXTERNALTRIGCONVEDGE_NONE;           //使用软件触发
                #endif
               
               
                ADC1_Handler.Init.Overrun                                                                                =        ADC_OVR_DATA_OVERWRITTEN;        //有新的数据的死后直接覆盖掉旧数据
               
                ADC1_Handler.Init.OversamplingMode                                        =        DISABLE;                                                                        //过采样关闭
               
  #if  defined(ADC_DMA)
                ADC1_Handler.Init.ConversionDataManagement        =        ADC_CONVERSIONDATA_DMA_CIRCULAR;         
        #else
          ADC1_Handler.Init.ConversionDataManagement        =        ADC_CONVERSIONDATA_DR;          //规则通道的数据仅仅保存在DR寄存器里面
               
   #endif
               
                if (HAL_ADC_Init(&ADC1_Handler) != HAL_OK)                                                                                                                        //初始化
                {
                        Error_Handler();
                }
                     
                //使用PA5 通道18或者19  通道号是引脚对应表规定好的。
                //ADC_RegularChnConfig(&ADC1_Handler,ADC_CHANNEL_18,ADC_REGULAR_RANK_1,ADC_SAMPLETIME_64CYCLES_5);
               
                //PA5
                 ADC_RegularChnConfig(&ADC1_Handler,ADC_CHANNEL_19,ADC_REGULAR_RANK_1,ADC_SAMPLETIME_810CYCLES_5);
                //ADC12_INP15 PA3
               
                 ADC_RegularChnConfig(&ADC1_Handler,ADC_CHANNEL_15,ADC_REGULAR_RANK_2,ADC_SAMPLETIME_810CYCLES_5);
               
//                ADC_RegularChnConfig(&ADC1_Handler,ADC_CHANNEL_16,ADC_REGULAR_RANK_1,ADC_SAMPLETIME_64CYCLES_5);
//                ADC_RegularChnConfig(&ADC1_Handler,ADC_CHANNEL_10,ADC_REGULAR_RANK_1,ADC_SAMPLETIME_64CYCLES_5);
       
                HAL_ADCEx_Calibration_Start(&ADC1_Handler,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);         //ADC校准
       
                #if defined(ADC1_TRIGGER_FROM_TIMER)
                        ADC_Timer_Init(&ADC1_Handler);
                        if(HAL_TIM_Base_Start(&ADC1Timer_Handler) != HAL_OK)
                        {
                                Error_Handler();
                        }
                #endif
               
       
//                if(HAL_ADC_Start_DMA(&ADC1_Handler, (uint32_t *)aADC1DualConvertedValues,ADCCONVERTEDVALUES_BUFFER_SIZE        ) != HAL_OK)
//                {
//                        Error_Handler();
//                }               
        }
void ADC_RegularChnConfig(ADC_HandleTypeDef *hadc, u32 Chn, u32 Rank, u32 SamplingTime)
{
        ADC_ChannelConfTypeDef sConfig;
       
        sConfig.Channel                                =        Chn;                  //通道
        sConfig.Rank                                        =        Rank;                                   //第n个序列
        sConfig.SamplingTime        =        SamplingTime;                            //采样时间      
        sConfig.SingleDiff                =        ADC_SINGLE_ENDED;                  //单边采集                         
        sConfig.OffsetNumber        =        ADC_OFFSET_NONE;                    
        sConfig.Offset                                =        0;
  sConfig.OffsetRightShift       = DISABLE;           /* 禁止右移 */
   sConfig.OffsetSignedSaturation = DISABLE;           /* 禁止有符号饱和 */
        HAL_ADC_ConfigChannel(hadc,&sConfig);                //通道配置
}

请问是什么原因,,
回复

使用道具 举报

2

主题

17

回帖

23

积分

新手上路

积分
23
发表于 2020-5-9 16:09:06 | 显示全部楼层
啃瓜子的猫 发表于 2020-5-9 14:21
硬汉哥,我用H7的ADC+DMA采集,我采集两个通道的ADC,
HAL_ADC_Start_DMA(&ADC1_Handler,SendBuf,1);这个 ...

硬汉哥,我用H7的ADC+DMA采集,我采集两个通道的ADC,
HAL_ADC_Start_DMA(&ADC1_Handler,SendBuf,1);这个函数只要最后一个参数大于1,我程序有看门狗,就会不断的喂狗。。我调试好像是可以进中断,不知道是不是一直中断。参数是1的时候,是没有问题的。
我的SendBuf参数是ALIGN_32BYTES (volatile uint32_t SendBuf[2]);

中断函数。
void  DMA1_Stream1_IRQHandler(void)
{
           ubADCDualConversionComplete = SET;
                __HAL_DMA_CLEAR_FLAG(&DMAx_Handler,DMA_FLAG_TCIF1_5);
         // __HAL_DMA_CLEAR_FLAG(&DMAx_Handler,DMA_FLAG_TCIF1_5|DMA_FLAG_TCIF0_4|DMA_FLAG_TCIF2_6|DMA_FLAG_TCIF3_7);
        
        //由于STM32H7 Cache的存在,凡是CPU和DMA都会操作到的存储器,
        //我们都要注意数据一致性问题。对于本章节要实现的功能,要注意读Cache问题,防止DMA已经更新了缓冲区的数据,而我们读取的却是Cache里面缓存的
         
        
         // NormalLoop();
}
ADC的配置和DMA的配置
void ADC_DMA_Init(ADC_HandleTypeDef* hadc)
{
        //DMA_HandleTypeDef  DMAx_Handler;
        
        if(hadc->Instance == ADC1)
        {
                __HAL_RCC_DMA1_CLK_ENABLE();
               
                DMAx_Handler.Instance = DMA1_Stream1;

    DMAx_Handler.Init.Request             = DMA_REQUEST_ADC1;
    DMAx_Handler.Init.Direction           = DMA_PERIPH_TO_MEMORY;
    DMAx_Handler.Init.PeriphInc           = DMA_PINC_DISABLE;
    DMAx_Handler.Init.MemInc              = DMA_MINC_ENABLE;
    DMAx_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;       /* Transfer from ADC by word to match with ADC configuration: Dual mode, ADC master contains conversion results on data register (32 bits) of ADC master and ADC slave  */
    DMAx_Handler.Init.MemDataAlignment    = DMA_PDATAALIGN_WORD;       /* Transfer to memory by word to match with buffer variable type: word */
    DMAx_Handler.Init.Mode                = DMA_CIRCULAR;              /* DMA in circular mode to match with ADC configuration: DMA continuous requests */
    DMAx_Handler.Init.Priority            = DMA_PRIORITY_HIGH;
               
                //////////////////////////////////////////////////////////////////
       DMAx_Handler.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;    /* 禁止FIFO*/
        DMAx_Handler.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL; /* 禁止FIFO此位不起作用,用于设置阀值 */
        DMAx_Handler.Init.MemBurst            = DMA_MBURST_SINGLE;       /* 禁止FIFO此位不起作用,用于存储器突发 */
        DMAx_Handler.Init.PeriphBurst         = DMA_PBURST_SINGLE;       /* 禁止FIFO此位不起作用,用于外设突发 */
    // Deinitialize  & Initialize the DMA for new transfer
    HAL_DMA_DeInit(&DMAx_Handler);
    HAL_DMA_Init(&DMAx_Handler);

    // Associate the initialized DMA handle to the ADC handle */
    __HAL_LINKDMA(hadc, DMA_Handle, DMAx_Handler);

    // NVIC configuration for DMA interrupt (transfer completion or error)
    // Priority: high-priority
   HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 1, 0);
    HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
        }
void ADC_Init(ADC_TypeDef *ADCx)
{
        if(ADCx == ADC1)
        {
                ADC1_Handler.Instance                                                                                                =        ADC1;
                ADC1_Handler.Init.ClockPrescaler                                                =        ADC_CLOCK_ASYNC_DIV2; //4分频,ADCCLK=PER_CK/2=64/2=32MHZ
                ADC1_Handler.Init.Resolution                                                                =        ADC_RESOLUTION_16B;       //16位模式
               
                 #if  defined(ADC_DMA)
           ADC1_Handler.Init.ScanConvMode                                                        =        ADC_SCAN_ENABLE;                  //非扫描模式        
          #else
          ADC1_Handler.Init.ScanConvMode                                                        =        DISABLE;                  //非扫描模式
               
   #endif
               
                ADC1_Handler.Init.EOCSelection                                                        =        ADC_EOC_SINGLE_CONV;      //关闭EOC中断
                ADC1_Handler.Init.LowPowerAutoWait                                        =        DISABLE;                                                                        //自动低功耗关闭                                
                //ADC1_Handler.Init.BoostMode=ENABLE;                                                                               //BOOT模式关闭
        //        ADC1_Handler.Init.DMA
                #if defined(ADC1_TRIGGER_FROM_TIMER)
                        ADC1_Handler.Init.ContinuousConvMode            = DISABLE;                                                       //关闭连续转换,Continuous mode disabled to have only 1 conversion at each conversion trig
                #else
                        ADC1_Handler.Init.ContinuousConvMode      = DISABLE;                   // Continuous mode to have maximum conversion speed (no delay between conversions)
                #endif
               
        #if  defined(ADC_DMA)
            ADC1_Handler.Init.ContinuousConvMode      = ENABLE;                   // Continuous mode to have maximum conversion speed (no delay between conversions)
        #else
            ADC1_Handler.Init.ContinuousConvMode      = DISABLE;                   // Continuous mode to have maximum conversion speed (no delay between conversions)
               
   #endif
                 
                ADC1_Handler.Init.NbrOfConversion                                                =        2;                        //1个转换在规则序列中 也就是只转换规则序列1
                ADC1_Handler.Init.DiscontinuousConvMode                        =        DISABLE;                                    //禁止不连续采样模式
                ADC1_Handler.Init.NbrOfDiscConversion                                =        0;                                    //不连续采样通道数为0
         
                #if defined(ADC1_TRIGGER_FROM_TIMER)
                        ADC1_Handler.Init.ExternalTrigConv        = ADC1_TRIGEER_TRGO; //Timer 15 external event triggering the conversion
                        ADC1_Handler.Init.ExternalTrigConvEdge    = ADC_EXTERNALTRIGCONVEDGE_RISING;
                #else
                        ADC1_Handler.Init.ExternalTrigConv        = ADC_SOFTWARE_START;       //软件触发
                        ADC1_Handler.Init.ExternalTrigConvEdge    = ADC_EXTERNALTRIGCONVEDGE_NONE;           //使用软件触发
                #endif
               
               
                ADC1_Handler.Init.Overrun                                                                                =        ADC_OVR_DATA_OVERWRITTEN;        //有新的数据的死后直接覆盖掉旧数据
               
                ADC1_Handler.Init.OversamplingMode                                        =        DISABLE;                                                                        //过采样关闭
               
  #if  defined(ADC_DMA)
                ADC1_Handler.Init.ConversionDataManagement        =        ADC_CONVERSIONDATA_DMA_CIRCULAR;         
        #else
          ADC1_Handler.Init.ConversionDataManagement        =        ADC_CONVERSIONDATA_DR;          //规则通道的数据仅仅保存在DR寄存器里面
               
   #endif
               
                if (HAL_ADC_Init(&ADC1_Handler) != HAL_OK)                                                                                                                        //初始化
                {
                        Error_Handler();
                }
                     
                //使用PA5 通道18或者19  通道号是引脚对应表规定好的。
                //ADC_RegularChnConfig(&ADC1_Handler,ADC_CHANNEL_18,ADC_REGULAR_RANK_1,ADC_SAMPLETIME_64CYCLES_5);
               
                //PA5
                 ADC_RegularChnConfig(&ADC1_Handler,ADC_CHANNEL_19,ADC_REGULAR_RANK_1,ADC_SAMPLETIME_810CYCLES_5);
                //ADC12_INP15 PA3
               
                 ADC_RegularChnConfig(&ADC1_Handler,ADC_CHANNEL_15,ADC_REGULAR_RANK_2,ADC_SAMPLETIME_810CYCLES_5);
               
//                ADC_RegularChnConfig(&ADC1_Handler,ADC_CHANNEL_16,ADC_REGULAR_RANK_1,ADC_SAMPLETIME_64CYCLES_5);
//                ADC_RegularChnConfig(&ADC1_Handler,ADC_CHANNEL_10,ADC_REGULAR_RANK_1,ADC_SAMPLETIME_64CYCLES_5);
        
                HAL_ADCEx_Calibration_Start(&ADC1_Handler,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);         //ADC校准
        
                #if defined(ADC1_TRIGGER_FROM_TIMER)
                        ADC_Timer_Init(&ADC1_Handler);
                        if(HAL_TIM_Base_Start(&ADC1Timer_Handler) != HAL_OK)
                        {
                                Error_Handler();
                        }
                #endif
               
        
//                if(HAL_ADC_Start_DMA(&ADC1_Handler, (uint32_t *)aADC1DualConvertedValues,ADCCONVERTEDVALUES_BUFFER_SIZE        ) != HAL_OK)
//                {
//                        Error_Handler();
//                }               
        }
void ADC_RegularChnConfig(ADC_HandleTypeDef *hadc, u32 Chn, u32 Rank, u32 SamplingTime)
{
        ADC_ChannelConfTypeDef sConfig;
        
        sConfig.Channel                                =        Chn;                  //通道
        sConfig.Rank                                        =        Rank;                                   //第n个序列
        sConfig.SamplingTime        =        SamplingTime;                            //采样时间      
        sConfig.SingleDiff                =        ADC_SINGLE_ENDED;                  //单边采集                          
        sConfig.OffsetNumber        =        ADC_OFFSET_NONE;                     
        sConfig.Offset                                =        0;
  sConfig.OffsetRightShift       = DISABLE;           /* 禁止右移 */
   sConfig.OffsetSignedSaturation = DISABLE;           /* 禁止有符号饱和 */
        HAL_ADC_ConfigChannel(hadc,&sConfig);                //通道配置
}

请问是什么原因,,
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106544
QQ
 楼主| 发表于 2020-5-9 16:14:12 | 显示全部楼层
啃瓜子的猫 发表于 2020-5-9 16:09
硬汉哥,我用H7的ADC+DMA采集,我采集两个通道的ADC,
HAL_ADC_Start_DMA(&ADC1_Handler,SendBuf,1);这 ...

用定时器触发,1秒触发一次看看正常不。
回复

使用道具 举报

2

主题

17

回帖

23

积分

新手上路

积分
23
发表于 2020-5-15 11:14:07 | 显示全部楼层
eric2013 发表于 2020-5-9 16:14
用定时器触发,1秒触发一次看看正常不。

可以了。我玩的是H745双核的,,开启了DMA中断,需要同时把传输完成和传输一半完成的标志位清除就可以了。。谢谢。。

然后我还有一个问题。我看ADC的时钟,看了你们的程序,我发现不太对劲,,
ADC的默认时钟怎么看出的AHB时钟的,我看手册是默认的是PLL2啊
回复

使用道具 举报

2

主题

17

回帖

23

积分

新手上路

积分
23
发表于 2020-5-15 13:29:33 | 显示全部楼层
啃瓜子的猫 发表于 2020-5-15 11:14
可以了。我玩的是H745双核的,,开启了DMA中断,需要同时把传输完成和传输一半完成的标志位清除就可以了 ...

附加
C:\Users\Administrator.PC-20180918HSRQ\Desktop\微信图片_20200515132701.png
[img]C:\Users\Administrator.PC-20180918HSRQ\Desktop\微信图片_20200515132709.pngC:\Users\Administrator.PC-20180918HSRQ\Desktop\微信图片_20200515132713.png[/img]
回复

使用道具 举报

2

主题

17

回帖

23

积分

新手上路

积分
23
发表于 2020-5-15 13:44:56 | 显示全部楼层
怎么发不了图片
回复

使用道具 举报

2

主题

17

回帖

23

积分

新手上路

积分
23
发表于 2020-5-15 13:45:46 | 显示全部楼层
位 17:16 ADCSEL[1:0]:SAR ADC 内核时钟源选择 (SAR ADC kernel clock source selection)
由软件置 1 和复位。
00:将 pll2_p_ck 时钟选作内核外设时钟(复位后的默认值)
01:将 pll3_r_ck 时钟选作内核外设时钟
10:将 per_ck 时钟选作内核外设时钟



位 29:28 CKPERSEL[1:0]:per_ck 时钟源选择 (per_ck clock source selection)
00:将 hsi_ker_ck 时钟选作 per_ck 时钟(复位后的默认值)
01:将 csi_ker_ck 时钟选作 per_ck 时钟
10:将 hse_ck 时钟选作 per_ck 时钟

回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2020-5-15 19:47:32 | 显示全部楼层
硬汉哥,请教个问题。
我现在ADC设置的是36MHz。采样1.5cycle, 转换7.5cycles(用的14bit)。一个快速通道和一个慢速通道,扫描,Circle DMA方式。这样算的话,采样率应该是4MHz吧。但实际上达不到。也就3.6的样子。是什么原因?快速通道和慢速通道在扫描转换的时候会插入延时吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106544
QQ
 楼主| 发表于 2020-5-15 20:24:11 | 显示全部楼层
艾那的小强 发表于 2020-5-15 19:47
硬汉哥,请教个问题。
我现在ADC设置的是36MHz。采样1.5cycle, 转换7.5cycles(用的14bit)。一个快速通道和 ...

看一楼的图片,你的封装能支持4Msps不。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106544
QQ
 楼主| 发表于 2020-5-15 20:25:26 | 显示全部楼层
啃瓜子的猫 发表于 2020-5-15 11:14
可以了。我玩的是H745双核的,,开启了DMA中断,需要同时把传输完成和传输一半完成的标志位清除就可以了 ...

PLL2要专门配置才行。
回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2020-5-15 23:08:08 | 显示全部楼层
eric2013 发表于 2020-5-15 20:24
看一楼的图片,你的封装能支持4Msps不。

谢谢硬汉哥。确实,我的不支持。我是H743,100脚的。看来最高到2.2。怪不得我觉得不太准呢。
回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2020-5-16 20:22:07 | 显示全部楼层
硬汉哥,再问一个问题哈。这个文档中只是说低速的通道阻抗高,但没有标注对于速度的影响。低速的能到多少呢?没找到注明的地方呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106544
QQ
 楼主| 发表于 2020-5-17 09:41:00 | 显示全部楼层
艾那的小强 发表于 2020-5-16 20:22
硬汉哥,再问一个问题哈。这个文档中只是说低速的通道阻抗高,但没有标注对于速度的影响。低速的能到多少呢 ...

数据手册里面呢。
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2020-5-18 09:47:18 | 显示全部楼层
eric2013 发表于 2020-4-22 15:11
做,整三代示波器的时候会做专门的测评。

很期待
加油!
回复

使用道具 举报

23

主题

1403

回帖

1472

积分

至尊会员

积分
1472
发表于 2020-8-23 08:52:14 | 显示全部楼层
今天正好有空,试试
代码不规范,亲人两行泪!
回复

使用道具 举报

1

主题

11

回帖

14

积分

新手上路

积分
14
发表于 2020-9-17 14:38:40
艾那的小强 发表于 2020-5-15 19:47
硬汉哥,请教个问题。
我现在ADC设置的是36MHz。采样1.5cycle, 转换7.5cycles(用的14bit)。一个快速通道和 ...

我的也是H743的100引脚的版本,你是怎么上到3.6MHz的采样率的,我已经调到12bbit了,还是不行

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-24 09:14 , Processed in 0.274316 second(s), 36 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表