u16 Get_adcvalue(void) { u16 Buff[10] = {0}; u16 temp = 0; u8 i,j; ADC_RegularChannelConfig(ADC1,2,1,ADC_SampleTime_239Cycles5); for(i = 0; i < 10; i++) { ADC_SoftwareStartConvCmd(ADC1,ENABLE); while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) != SET) { } Buff[i] = ADC_GetConversionValue(ADC1); } for(i = 0; i < 9; i++) { for(j = i + 1; j < 10; j++) { if(Buff[i] > Buff[j]) { temp = Buff[i]; Buff[i] = Buff[j]; Buff[j] = temp; } } } temp = 0; for(i = 1; i < 9; i++) { temp += Buff[i]; } return (temp / 8); }
时间: 2024-02-04 07:02:58 浏览: 22
这是一段C语言代码,实现了获取ADC采集的电压值的功能。代码中定义了一个函数Get_adcvalue,返回值为unsigned short类型,表示ADC采集的电压值。函数中定义了一个长度为10的数组Buff,用于存放ADC采集到的10个电压值。代码首先通过ADC_RegularChannelConfig函数配置ADC采集通道和采样时间。然后循环10次,每次使用ADC_SoftwareStartConvCmd函数启动ADC转换,并使用ADC_GetConversionValue函数获取转换后的电压值,存放到数组Buff中。接着使用冒泡排序法对数组Buff进行排序,去掉最大值和最小值,再计算剩余8个数的平均值,作为最终的ADC采集电压值,返回给调用函数。
相关问题
优化这段函数:FUNCTION fb_get_pointer(a, b , c, d AS FLOAT(), rtn AS INTEGER(), ratio AS FLOAT) DIM i , j AS INTEGER DIM start_i, start_j , stop_j , stop_i AS INTEGER DIM rtn1 , rtn2 AS INTEGER DIM exit_temp , data_temp , flag_temp , exit_temp2 AS INTEGER start_i = start_j = stop_j = stop_i = exit_temp = 0 data_temp = flag_temp = exit_temp2 = 0 FOR j = 0 TO 899 FOR i = 0 TO 1799 IF ABS(a(j) - b(i)) < ratio AND _ ABS(c(j) - d(i)) < ratio THEN 'PRINT j , i, a(j) , b(i), c(j), d(i) , start_j , start_i IF start_i = 0 THEN start_i = i IF start_j = 0 THEN start_j = j IF stop_i < i THEN stop_i = i IF stop_j < j THEN stop_j = j ENDIF data_temp = i exit_temp = 1 flag_temp = 1 ELSEIF data_temp <> i AND i= 1799 AND exit_temp = 0 AND flag_temp = 1 THEN ' PRINT j , i exit_temp2 = 1 EXIT_LOOP ENDIF NEXT i exit_temp = 0 IF exit_temp2 = 1 THEN EXIT_LOOP ENDIF NEXT j rtn1 = INT((start_j + stop_j) / 2) rtn2 = INT((start_i + stop_i) / 2) ' PRINT rtn1 , rtn2 rtn = rtn1 , rtn2 ENDFUNC
这段函数可以进行以下优化:
1. 将循环中的 ABS 函数提前计算并存储,避免重复计算。
2. 将循环中的 IF 判断语句合并,减少判断次数。
3. 将循环中的变量赋值语句提前计算并存储,避免重复计算。
优化后的代码如下:
FUNCTION fb_get_pointer(a, b , c, d AS FLOAT(), rtn AS INTEGER(), ratio AS FLOAT)
DIM i , j AS INTEGER
DIM start_i, start_j , stop_j , stop_i AS INTEGER
DIM rtn1 , rtn2 AS INTEGER
DIM exit_temp , data_temp , flag_temp , exit_temp2 AS INTEGER
DIM abs_a, abs_c AS FLOAT
start_i = start_j = stop_j = stop_i = exit_temp =
data_temp = flag_temp = exit_temp2 =
abs_a =
abs_c =
FOR j = TO 899
abs_c = c(j)
FOR i = TO 1799
abs_a = ABS(a(j) - b(i))
IF abs_a < ratio AND abs_c - d(i) < ratio THEN
IF start_i = THEN start_i = i
IF start_j = THEN start_j = j
IF stop_i < i THEN stop_i = i
IF stop_j < j THEN stop_j = j
data_temp = i
exit_temp = 1
flag_temp = 1
ELSEIF data_temp <> i AND i= 1799 AND exit_temp = AND flag_temp = 1 THEN
exit_temp2 = 1
EXIT_LOOP
ENDIF
NEXT i
exit_temp =
IF exit_temp2 = 1 THEN
EXIT_LOOP
ENDIF
NEXT j
rtn1 = INT((start_j + stop_j) / 2)
rtn2 = INT((start_i + stop_i) / 2)
rtn = rtn1 , rtn2
ENDFUNC
u16 Get_Adc_Average(u8 ch,u8 times) { u32 temp_val=0; u8 t; for(t=0;t<times;t++) { temp_val+=Get_Adc(ch); delay_ms(5); } return temp_val/times; }
这是一个函数,名为Get_Adc_Average。它的功能是获取指定通道(ch)的ADC值,并进行多次采样(times次),然后求取平均值。具体实现如下:
首先,定义一个32位无符号整型变量temp_val,并初始化为0。
然后,定义一个8位无符号整型变量t,用于循环计数。
在循环中,通过调用Get_Adc函数获取ADC值,并累加到temp_val中。
每次采样后,延时5毫秒。
循环结束后,返回temp_val除以times的结果作为平均值。
注意:你没有提供Get_Adc函数的实现代码,所以无法确定它的具体功能。此外,delay_ms函数也没有提供,你可能需要自行实现或使用其他方式进行延时操作。