This repository has been archived on 2025-04-28. You can view files and clone it, but cannot push or open issues or pull requests.
CMS3in1/1.Cabin/4.MISC/断线监测/OfflineDetection/Drivers/SYSTEM/adc/adc.c

119 lines
4.7 KiB
C
Raw Normal View History

#include "./SYSTEM/adc/adc.h"
#include "./SYSTEM/delay/delay.h"
ADC_HandleTypeDef hadc3;
/* ADC3 初始化函数 */
void MX_ADC3_Init(void){
ADC_ChannelConfTypeDef sConfig = {0};
/** 配置 ADC 的全局特性(时钟,分辨率,数据对齐和转换数量)
*/
hadc3.Instance = ADC3; //ADC3
hadc3.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; //4分频
hadc3.Init.Resolution = ADC_RESOLUTION_8B; //8位精度
hadc3.Init.ScanConvMode = DISABLE; //禁用扫描模式
hadc3.Init.ContinuousConvMode = DISABLE; //关闭连续转换
hadc3.Init.DiscontinuousConvMode = DISABLE; //禁用不连续转换模式
hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; //不使用外部触发
hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START; //软件触发
hadc3.Init.DataAlign = ADC_DATAALIGN_RIGHT; //右对齐
hadc3.Init.NbrOfConversion = 1; //1个转换在规则序列中 也就是只转换规则序列1
hadc3.Init.DMAContinuousRequests = DISABLE; //禁用DMA
hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV; //单次转换模式
HAL_ADC_Init(&hadc3);
}
/**
* @brief ADC底层驱动使
HAL_ADC_Init()
* @param hadc:ADC句柄
* @retval
*/
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(adcHandle->Instance==ADC3)
{
/* 使能 ADC3 时钟 */
__HAL_RCC_ADC3_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
/** ADC3 GPIO 配置
PF3 ------> ADC3_IN9
PF4 ------> ADC3_IN14
*/
GPIO_InitStruct.Pin = Offline_Detection1_Pin|Offline_Detection2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
}
}
/**
* @brief ADC通道采样时间
* @param adcx : adc句柄指针,ADC_HandleTypeDef
* @param ch : , ADC_CHANNEL_0~ADC_CHANNEL_17
* @param stime: 0~7, :
* @arg ADC_SAMPLETIME_3CYCLES, 3ADC时钟周期 ADC_SAMPLETIME_15CYCLES, 15ADC时钟周期
* @arg ADC_SAMPLETIME_28CYCLES, 28ADC时钟周期 ADC_SAMPLETIME_56CYCLES, 56ADC时钟周期
* @arg ADC_SAMPLETIME_84CYCLES, 84ADC时钟周期 ADC_SAMPLETIME_112CYCLES,112ADC时钟周期
* @arg ADC_SAMPLETIME_144CYCLES,144ADC时钟周期 ADC_SAMPLETIME_480CYCLES,480ADC时钟周期
* @param rank: ,
channel1的rank=1channel2的rank=2
DMA缓存空间的变量数组AdcDMA[0] i是channel1的转换结果AdcDMA[1]2
DMA设置为 ADC_REGULAR_RANK_1
* @arg 1~16ADC_REGULAR_RANK_1~ADC_REGULAR_RANK_16
* @retval
*/
void adc_channel_set(ADC_HandleTypeDef *adc_handle, uint32_t ch, uint32_t rank, uint32_t stime)
{
/* 配置对应ADC通道 */
ADC_ChannelConfTypeDef adc_channel;
adc_channel.Channel = ch; /* 设置ADCX对通道ch */
adc_channel.Rank = rank; /* 设置采样序列 */
adc_channel.SamplingTime = stime; /* 设置采样时间 */
HAL_ADC_ConfigChannel( adc_handle, &adc_channel);
}
/**
* @brief ADC转换后的结果
* @param ch: 0~17ADC_CHANNEL_0~ADC_CHANNEL_17
* @retval
*/
uint32_t adc_get_result(uint32_t ch)
{
adc_channel_set(&hadc3, ch, 1, ADC_SAMPLETIME_480CYCLES); /* 设置通道,序列和采样时间 */
HAL_ADC_Start(&hadc3); /* 开启ADC */
HAL_ADC_PollForConversion(&hadc3, 10); /* 轮询转换 */
return (uint16_t)HAL_ADC_GetValue(&hadc3); /* 返回最近一次ADC1规则组的转换结果 */
}
/**
* @brief ch的转换值times次,
* @param ch : , 0~17
* @param times :
* @retval ch的times次转换结果平均值
*/
uint32_t adc_get_result_average(uint32_t ch, uint8_t times)
{
uint32_t temp_val = 0;
uint8_t t;
for (t = 0; t < times; t++) /* 获取times次数据 */
{
temp_val += adc_get_result(ch);
delay_ms(5);
}
return temp_val / times; /* 返回平均值 */
}