#define ADC_TIMES 30 #define ADCLOST 7 unsigned int GetADC(unsigned char ch) { unsigned int i, j; unsigned int buf[ADC_TIMES]; unsigned long int sum; long int temp; static long int XQ = 0; ADC_Set(ch); for(i=0; i < ADC_TIMES; i++) { buf[i] = ADC_GetConversionValue(ADC1);; delay_us(100); } for(i = 0; i < ADC_TIMES - 1; i++) { for(j = i + 1; j < ADC_TIMES; j++) { if(buf[i] > buf[j]) { temp = buf[i]; buf[i] = buf[j]; buf[j] = temp; } } } sum = 0; for(i = ADCLOST; i < ADC_TIMES - ADCLOST; i++) { sum += buf[i]; } temp = sum / (ADC_TIMES - 2 * ADCLOST); if( (XQ>=temp && (XQ-temp)<=1 ) || (XQ<temp && (temp-XQ)<=1)) { temp = XQ; } else { XQ = temp; } return (unsigned int)(temp); }
时间: 2023-06-16 16:04:37 浏览: 61
这是一个获取ADC值的函数,其中包含了一些滤波和去抖动的操作。函数的主要流程如下:
1. 设置ADC通道
2. 获取ADC值,并将其存储到buf数组中
3. 对buf数组进行排序,去掉最小值和最大值
4. 计算buf数组的平均值,作为最终ADC值
5. 进行去抖动处理,如果当前ADC值与上一次的值相差不超过1,则将其认为是同一个值,否则更新XQ和当前ADC值
其中,ADC_TIMES表示获取ADC值的次数,ADCLOST表示去掉最小值和最大值的个数,可以根据需要进行调整。
相关问题
#define VIDEOHDFRMLEN ((unsigned long long)(1920*1080*2*2)) #define VIDEOBSNUM ((unsigned long long)200) #define VIDEOBSLEN ((unsigned long long)(3840*2160)) #define AUDIOBUFFNUM ((unsigned long long)200) #define AUDIOFRAMELEN ((unsigned long long)204800) #define UDPFIFOSIZE 500*1000*188 #define MUX_CHANNEL_INDEX 86 #define MAX_SYSCMD_NUM 192 #define MAX_ENCODER_NUM 96 #define MAX_QCAP_DEVICE_NUM 8 #define MAX_IN_DEVICE_NUM 16 #define MAX_OUT_DEVICE_NUM 16 #define MAX_BUF_NUM 64 #define MAX_DEV_NUM 64 #define MAX_NAME_LEN 1024 #define MAX_COMMAND_LEN 102400 #define HANDLE void* #define REDVLEN (512 * 32 * 2) //ÿ�δӻ�������ȡ�����ݴ�С������ 10M ���ʼ��㣩 #define VIRLEN
这段代码是一系列的宏定义,用于定义一些常量和类型。
- `VIDEOHDFRMLEN` 定义了高清视频帧的长度,计算方式与前面的宏定义类似。
- `VIDEOBSNUM` 定义了视频比特流的数量。
- `VIDEOBSLEN` 定义了视频比特流的长度。
- `AUDIOBUFFNUM` 定义了音频缓冲区的数量。
- `AUDIOFRAMELEN` 定义了音频帧的长度。
- `UDPFIFOSIZE` 定义了UDP数据包的FIFO大小。
- `MUX_CHANNEL_INDEX` 定义了多路复用通道的索引。
- `MAX_SYSCMD_NUM` 定义了最大系统命令数量。
- `MAX_ENCODER_NUM` 定义了最大编码器数量。
- `MAX_QCAP_DEVICE_NUM` 定义了最大QCAP设备数量。
- `MAX_IN_DEVICE_NUM` 定义了最大输入设备数量。
- `MAX_OUT_DEVICE_NUM` 定义了最大输出设备数量。
- `MAX_BUF_NUM` 定义了最大缓冲区数量。
- `MAX_DEV_NUM` 定义了最大设备数量。
- `MAX_NAME_LEN` 定义了最大名称长度。
- `MAX_COMMAND_LEN` 定义了最大命令长度。
- `HANDLE` 定义了一个void指针类型,通常用作句柄或指针类型的别名。
- `REDVLEN` 定义了某种数据结构的长度。
- `VIRLEN` 在代码中没有给出定义,可能是一个未完成的宏定义。
这些宏定义可以在代码中使用,用于表示特定的常量值或数据类型,使得代码更加易读和易维护。
union semun { int val; struct semid_ds *buf; unsigned short *array; };在最新版本ubantu下应该怎么改
在最新版本的Ubuntu中,`semun`已被删除,但是可以使用一个标准的替代方案,即将`semun`替换为`union semun`,并在程序中添加以下宏定义:
```
#define _GNU_SOURCE
```
这将启用GNU扩展,从而包含`semun`的定义。
然后,您可以使用以下代码来初始化一个信号量:
```
int semid = semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT);
union semun arg;
arg.val = 1;
semctl(semid, 0, SETVAL, arg);
```
这个方法可以确保您的代码可以在任何平台上运行,并且不会出现与标准库版本相关的问题。