HAL驱动库学习-ADC

如何使用ADC驱动库
1  实现如下两个函数
    a: HAL_ADC_MspInit()使能ADC时钟,设置时钟源, 使能ADC Pin,设置为输入模式,可选 DMA,中断
    b:HAL_ADC_MspDeInit() 与 HAL_ADC_MspInit()作用相反,用来关闭ADC,可选 DMA,中断
2  配置ADC参数,详细参数描述参考ADC属性定义。通过HAL_ADC_Init()来加载参数
3  配置ADC通道,包括使用的通道,采样时间等 HAL_ADC_ConfigChannel()
4  校准ADC(HAL_ADCEx_Calibration_Start(&hadc);有些芯片不支持校准),必须在ADC转换启动前或停止后
5  使用下面函数中的一个激活ADC外设:
    HAL_ADC_Start() -- 轮询模式
    HAL_ADC_Start_IT(), -- 中断模式
    HAL_ADC_Start_DMA(). -- DMA模式
 
ADC属性定义
•  uint32_tClockPrescaler--时钟源,同步PLL,异步HSI  ADC_CLOCK_ASYNC,ADC_CLOCK_SYNC_PCLK_DIV2,ADC_CLOCK_SYNC_PCLK_DIV4,ADC_CLOCKPRESCALER_PCLK_DIV2,ADC_CLOCKPRESCALER_PCLK_DIV4
•  uint32_tResolution  -- ADC分辨率(6,8,10,12)ADC_RESOLUTION12b........
•  uint32_tDataAlign   --数据对齐方式(左,右)ADC_DATAALIGN_LEFT, ADC_DATAALIGN_RIGHT
•  uint32_tScanConvMode--配置规则组序列,该参数可以关联“DiscontinuousConvMode”对主序列细分,如果设置多个通道则序列自动使能;如果只有一个通道,执行单一转换模式;如果有多个通道,执行序列转换模式;Rank(队列)定义为通道号,rank0->channel0,rank1-->channel1.....;扫描方向可以递增(0-->18)或递减(18-->0)ADC_SCAN_DIRECTION_FORWARD,ADC_SCAN_DIRECTION_BACKWARD,ADC_SCAN_ENABLE
•  uint32_tEOCSelection   -- EOC(EndOfConversion),用来做轮询或中断标记;每个rank转换结束,或序列转换结束;EOC_SINGLE_CONV,EOC_SEQ_CONV,EOC_SINGLE_SEQ_CONV(保留供以后用)
•  uint32_tLowPowerAutoWait
•  uint32_tLowPowerAutoPowerOff
•  uint32_tContinuousConvMode  --定义当选择的触发事件(软件触发 or 外部触发)发生后规则组执行单一转换还是连续转换 ENABLE or DISABLE
•  uint32_tDiscontinuousConvMode---指定当规则组是完整序列/非连续序列(序列分布在)时是否转换序列;只有在Continuous禁用时,DisContinuous才有效;如果ContinuousConvMode使能,则该参数抛弃
•  uint32_tExternalTrigConv  --触发方式 ADC_SOFTWARE_START 外部触发禁止,使用软件触发
•  uint32_tExternalTrigConvEdge  --外部触发规则,ADC_EXTERNALTRIGCONVEDGE_NONE,ADC_EXTERNALTRIGCONVEDGE_RISING,ADC_EXTERNALTRIGCONVEDGE_FALLING,ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING 
•  uint32_tDMAContinuousRequests--//DMA转换请求,指定DMA执行单次(当转换数达标时停止传送)or连续请求模式;备注:连续模式:
//DMA必须配置为循环模式,否则当DMA buffer存满时将触发溢出; ENABLE or DISABLE
•  uint32_tOverrun--选择数据溢出时的行为:保存数据或覆盖数据;这个参数只作用于规则组,包含DMA

 

说明:
ContinuousConvMode DiscontinuousConvMode   通道结束 序列结束    
DISABLE DISABLE 单次转换 EOC EOS 单次转换 触发一次,转换一个序列(转换所有被选通道),转换结束后停止
ENABLE 无效 连续转换 EOC EOS 连续转换 触发一次,转换一个序列(转换所有被选通道),转换结束后自动重新开始
DISABLE ENABLE 断续转换 EOC EOS 断续转换 触发一次,转换一个通道,在触发,在转换。在所选转换通道循环
 
ADC方法:
    1  初始化函数
        a  自定义初始化           
 HAL_ADC_Init()       用户自行调用 加载ADC属性
 HAL_ADC_MspInit()    由HAL_ADC_Init()调用,对底层初始化,主要包括时钟,IO,DMA等

        b 缺醒初始化   

  HAL_ADC_DeInit()       用户自行调用,退出ADC
  HAL_ADC_MspDeInit()    由 HAL_ADC_DeInit()调用,操作底层,关闭时钟,IO等

    2   IO操作函数(轮询,中断,DMA 3中编程模型)

        a  激活ADC,启动转换规则组           
  •  HAL_ADC_Start()
  •  HAL_ADC_Start_IT()  中断模式ADC_EOC_SINGLE_CONV通道转换结束,EOC_SEQ_CONV序列转换结束
  •  HAL_ADC_Start_DMA()

         b  关闭ADC,停止转换规则组

  •  HAL_ADC_Stop()
  •  HAL_ADC_Stop_IT()
  •  HAL_ADC_Stop_DMA()
        C  读取ADC值
             •  HAL_ADC_GetValue()
        d  其他
•  HAL_ADC_PollForConversion()      等待转换结束,不适用一下情况:DMA模式且轮询每个转换(ADC_EOC_SINGLE_CONV)
•  HAL_ADC_PollForEvent()
•  HAL_ADC_IRQHandler()             ADC中断请求,在<stm32fxx_it.c>中调用

// 回调函数,“weak”属性,使用时再在应用代码中实现  
•  HAL_ADC_ConvCpltCallback()         转换完成后回调,DMA模式下DMA传输完成后调用
•  HAL_ADC_ConvHalfCpltCallback()  转换过程中回调
•  HAL_ADC_LevelOutOfWindowCallback()
•  HAL_ADC_ErrorCallback()

    3  外设控制函数--动态配置外设参数

            •  HAL_ADC_ConfigChannel()  配置规则组通道
            •  HAL_ADC_AnalogWDGConfig()
   4  状态函数--返回运行状态获取错误信息
            •  HAL_ADC_GetState()
            •  HAL_ADC_GetError()
 
例子,ADC工作状态均为非阻塞 
     1  轮询模式 -- 非阻塞    
/*##-3- Start the conversion process ######/
if(HAL_ADC_Start(&AdcHandle) != HAL_OK)
{ Error_Handler(); }
/*##-4- Wait for the end of conversion ######/
HAL_ADC_PollForConversion(&AdcHandle, 10);
if(HAL_ADC_GetState(&AdcHandle) == HAL_ADC_STATE_EOC_REG)
{
/*##-5- Get the converted value of channel ##*/
uhADCxConvertedValue = HAL_ADC_GetValue(&AdcHandle);
} 

     2  中断模式

/*##-3- Start the conversion process ######/
if(HAL_ADC_StartIT(&AdcHandle) != HAL_OK)
{ Error_Handler(); }
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{ /* Get the converted value of regular channel */
uhADCxConvertedValue = HAL_ADC_GetValue(AdcHandle);
}

     3  DMA模式

/*##-3- Start the conversion process ######/
if(HAL_ADC_StartDMA(&AdcHandle,&uhADCxConvertedValue,1) != HAL_OK)
{ Error_Handler(); }
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{ /* Turn LED1 on: Transfer process is correct */
BSP_LED_On(LED1);
}

使用stm32cubemx设置

      
      
 
  收集
        数组设置   
  1. 更进一步将if(HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&uhADCxConvertedValue,1)!= HAL_OK),中的1改成6,然后将转换后的存储变量定义为二维数组uhADCxConvertedValue[2][3];再观察串口输出的情况如下:v
  2. alue[0][0] is 0
    value[0][1] is 255 
    value[0][2] is 255 
    value[1][0] is 0
    value[1][1] is 255 
    value[1][2] is 255 
    value[0][0] is 0
    value[0][1] is 255 
    value[0][2] is 255 
    value[1][0] is 0
    value[1][1] is 255 
    value[1][2] is 255 
    value[0][0] is 0
    value[0][1] is 255 
    value[0][2] is 255 
    value[1][0] is 1
    value[1][1] is 255 
    value[1][2] is 255 
    

     

  3. 这样就是把第一次扫描转换的三个通道值存在数组的第一行的三个元素中,第二次扫描转换的值放在第二行的三个元素中。这样就可以方便后面的数字滤波处理了。
 
 





posted @ 2015-11-20 22:35  好心情_梦想  阅读(32122)  评论(0编辑  收藏  举报