123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- #include "adc.h"
- #include "soft_adc.h"
- uint16_t ADC_value = 0;
- float aver_value = 0;
- uint8_t adc_cnt = 0;
- uint32_t ADC_flag = 0;
- /*********************AD中断回调*******************/
- void HAL_ADC_ConvCpltCallback( ADC_HandleTypeDef *hadc )
- {
- ADC_flag = 1;
- }
- /**
- * @file buf_sort
- * @brief 冒泡 从小到大
- * @param arr, length
- * @details
- * @author Zhang Sir
- **/
- void buf_sort( float *arr, uint32_t length )
- {
- if ( length < 2 )
- {
- return;
- }
- uint32_t num = 0, num1 = 0;
- float tmp = 0;
- for ( num = length - 1; num >= 1; num-- )
- {
- for ( num1 = 0; num1 <= num - 1; num1++ )
- {
- if ( *( arr + num1 ) > *( arr + num1 + 1 ) )
- {
- tmp = *( arr + num1 );
- *( arr + num1 ) = *( arr + num1 + 1 );
- *( arr + num1 + 1 ) = tmp;
- }
- }
- }
- }
- /**
- * @file Get_ADCChannelValue
- * @brief 获取不同通道ad采集
- * @param None
- * @details
- * @author Zhang Sir
- **/
- uint16_t Get_ADCChannelValue(ADC_HandleTypeDef *hadc, uint32_t channel)
- {
- uint16_t temp_adc = 0;
- ADC_ChannelConfTypeDef ADC_ChanConf;
- ADC_ChanConf.Channel = channel;
- ADC_ChanConf.Rank = ADC_REGULAR_RANK_1;
- ADC_ChanConf.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
- if (HAL_ADC_ConfigChannel(hadc, &ADC_ChanConf) != HAL_OK)
- {
- Error_Handler();
- }
- HAL_ADC_Start_IT(hadc);
- HAL_ADC_PollForConversion(hadc, 1);
- temp_adc = HAL_ADC_GetValue(hadc);
- return temp_adc;
- }
- /**
- * @file adc_gather_hz
- * @brief AD电压采集
- * @param None
- * @details
- * @author Zhang Sir
- **/
- static float ADC_buf[20];
- float ADC_temp = 0.0f;
- void adc_gather_hz()
- {
- static uint32_t adc_time = 0;
- if ( HAL_GetTick() - adc_time > 20 )
- {
- ADC_buf[adc_cnt] = Get_ADCChannelValue(&hadc1, ADC_CHANNEL_0);
- HAL_ADC_Stop(&hadc1);
- adc_cnt++;
- if ( adc_cnt >= 20 )
- {
- adc_cnt = 0;
- }
- adc_time = HAL_GetTick();
- }
- }
- /**
- * @file ADC_gather
- * @brief AD采集转换成电压
- * @param None
- * @details
- * @author Zhang Sir
- **/
- float ADC_gather( void )
- {
- float real_value = 0;
- if ( ADC_flag == 1 )
- {
- ADC_flag = 0;
- buf_sort( ADC_buf, 20 );
- for ( uint8_t ib = 1; ib < 19; ib++ )
- {
- real_value += ADC_buf[ib];
- }
- //aver_value = real_value / 4096 * 3.3f / 18 * 28 * 1000; //Mv 4096*3 真实电压 , 取18个值 , pmu28分频
- //12bit 4095 超过94V 28分频不够
- aver_value = real_value / 4096 * 3.226f / 18 * 31 * 1000; //Mv 4096*3 真实电压 , 取18个值 , pmu31分频
- }
- return aver_value;
- }
- /**
- * @file ADC_read_temptrue
- * @brief ad温度采集
- * @param None
- * @details
- * @author Zhang Sir
- **/
- uint16_t ADC_read_temptrue()
- {
- uint16_t mcu_temp = 0;
- float mcu_temp1 = 0;
- mcu_temp = Get_ADCChannelValue(&hadctemp, ADC_CHANNEL_16);
- HAL_ADC_Stop(&hadctemp);
- mcu_temp1 = ( int )( ( 1.43f - mcu_temp * 3.3f / 4096 ) / 0.00043f + 250 ) / 10.0f;
- return mcu_temp1;
- }
|