2025-09-12 09:53:32 +00:00
|
|
|
|
#include "drv_adc.h"
|
|
|
|
|
#include "stdlib.h"
|
|
|
|
|
#include "string.h"
|
|
|
|
|
#include "gd32f4xx.h"
|
2025-09-13 09:22:00 +00:00
|
|
|
|
#include "gd32f4xx_adc.h"
|
|
|
|
|
#include "gd32f4xx_dma.h"
|
2025-09-12 09:53:32 +00:00
|
|
|
|
#include "rtthread.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-09-13 10:04:22 +00:00
|
|
|
|
void init_data_collect_module(void)
|
|
|
|
|
{
|
|
|
|
|
adc_gpio_config();
|
|
|
|
|
adc_config();
|
|
|
|
|
}
|
2025-09-13 09:22:00 +00:00
|
|
|
|
|
|
|
|
|
void adc_gpio_config(void)
|
2025-09-12 09:53:32 +00:00
|
|
|
|
{
|
2025-09-13 09:22:00 +00:00
|
|
|
|
/* 启用GPIOA时钟 */
|
2025-09-12 09:53:32 +00:00
|
|
|
|
rcu_periph_clock_enable(RCU_GPIOC);
|
2025-09-13 09:22:00 +00:00
|
|
|
|
/* 启用ADC0时钟 */
|
2025-09-12 09:53:32 +00:00
|
|
|
|
rcu_periph_clock_enable(RCU_ADC1);
|
2025-09-13 09:22:00 +00:00
|
|
|
|
|
2025-09-13 10:04:22 +00:00
|
|
|
|
adc_clock_config(ADC_ADCCK_PCLK2_DIV4);
|
|
|
|
|
|
|
|
|
|
|
2025-09-13 09:22:00 +00:00
|
|
|
|
/* 配置ADC引脚为模拟输入模式 */
|
|
|
|
|
gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, VOLTAGE_ADC_PIN);
|
|
|
|
|
gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, CURRENT_ADC_PIN);
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-13 10:04:22 +00:00
|
|
|
|
|
|
|
|
|
|
2025-09-13 09:22:00 +00:00
|
|
|
|
void adc_config(void)
|
|
|
|
|
{
|
|
|
|
|
// 复位ADC配置(可选,但建议初始化时做一次)
|
|
|
|
|
adc_deinit();
|
|
|
|
|
|
|
|
|
|
// 配置数据对齐方式为右对齐
|
2025-09-13 10:04:22 +00:00
|
|
|
|
adc_data_alignment_config(ADCX, ADC_DATAALIGN_RIGHT);
|
2025-09-13 09:22:00 +00:00
|
|
|
|
|
|
|
|
|
// 配置ADC分辨率:12位
|
2025-09-13 10:04:22 +00:00
|
|
|
|
adc_resolution_config(ADCX, ADC_RESOLUTION_12B);
|
2025-09-13 09:22:00 +00:00
|
|
|
|
|
|
|
|
|
/* ########## 设置转换通道序列 ########## */
|
|
|
|
|
// 配置规则序列的长度:2个通道
|
2025-09-13 10:04:22 +00:00
|
|
|
|
adc_channel_length_config(ADCX, ADC_ROUTINE_CHANNEL, ADC_CHANNEL_NUM);
|
2025-09-13 09:22:00 +00:00
|
|
|
|
|
|
|
|
|
// 配置规则序列:序号0是电压通道,序号1是电流通道
|
2025-09-13 10:04:22 +00:00
|
|
|
|
adc_routine_channel_config(ADCX, 0, VOLTAGE_ADC_CHANNEL, ADC_SAMPLETIME_480);
|
|
|
|
|
adc_routine_channel_config(ADCX, 1, CURRENT_ADC_CHANNEL, ADC_SAMPLETIME_480);
|
2025-09-13 09:22:00 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 打开扫描模式
|
2025-09-13 10:04:22 +00:00
|
|
|
|
adc_special_function_config(ADCX, ADC_SCAN_MODE, ENABLE);
|
2025-09-13 10:15:31 +00:00
|
|
|
|
|
2025-09-13 09:22:00 +00:00
|
|
|
|
// 禁止连续模式 -> 单次转换模式
|
2025-09-13 10:04:22 +00:00
|
|
|
|
adc_special_function_config(ADCX, ADC_CONTINUOUS_MODE, ENABLE);
|
2025-09-13 09:22:00 +00:00
|
|
|
|
|
|
|
|
|
// 使能外部触发:这里使用软件触发,所以先禁用硬件触发
|
2025-09-13 10:04:22 +00:00
|
|
|
|
adc_external_trigger_config(ADCX, ADC_ROUTINE_CHANNEL, DISABLE);
|
2025-09-13 09:22:00 +00:00
|
|
|
|
|
|
|
|
|
// 开启ADC
|
2025-09-13 10:04:22 +00:00
|
|
|
|
adc_enable(ADCX);
|
2025-09-13 09:22:00 +00:00
|
|
|
|
|
|
|
|
|
// 等待ADC稳定
|
|
|
|
|
rt_thread_mdelay(100);
|
|
|
|
|
|
|
|
|
|
// 执行ADC自校准
|
2025-09-13 10:04:22 +00:00
|
|
|
|
adc_calibration_enable(ADCX);
|
2025-09-12 09:53:32 +00:00
|
|
|
|
|
2025-09-13 10:04:22 +00:00
|
|
|
|
// 软件触发使能
|
|
|
|
|
adc_software_trigger_enable(ADCX, ADC_ROUTINE_CHANNEL);
|
2025-09-13 09:22:00 +00:00
|
|
|
|
}
|
2025-09-12 09:53:32 +00:00
|
|
|
|
|
2025-09-13 10:04:22 +00:00
|
|
|
|
|
|
|
|
|
|
2025-09-12 09:53:32 +00:00
|
|
|
|
|
2025-09-13 09:22:00 +00:00
|
|
|
|
// adc采集
|
|
|
|
|
float ptz_adc1_collect_task()
|
2025-09-12 09:53:32 +00:00
|
|
|
|
{
|
2025-09-13 09:22:00 +00:00
|
|
|
|
// static float adc1_v[LB_TIMES];
|
|
|
|
|
// static float curadc1_out;
|
|
|
|
|
// static uint8_t adc1_num = 0;
|
2025-09-13 10:04:22 +00:00
|
|
|
|
int j,k;
|
|
|
|
|
float tem;
|
|
|
|
|
float curadc1;
|
|
|
|
|
uint16_t value_V = 0;
|
2025-09-13 09:22:00 +00:00
|
|
|
|
|
2025-09-13 10:04:22 +00:00
|
|
|
|
while(adc_flag_get(ADCX, ADC_FLAG_EOC) == RESET); // 等待转换结束
|
|
|
|
|
value_V = adc_routine_data_read(ADCX); // 读取规则组数据寄存器
|
2025-09-13 09:22:00 +00:00
|
|
|
|
|
|
|
|
|
// ... 后面的中位值平均滤波处理保持不变 ...
|
|
|
|
|
// *11,硬件需要
|
|
|
|
|
// adc1_v[adc1_num] = (float)value_V / 4096.0 * 3.3; // 间接测量,11倍分压/放大
|
2025-09-13 10:04:22 +00:00
|
|
|
|
curadc1 = (float)value_V / 4095.0 * 3.3; // 间接测量,11倍分压/放大
|
2025-09-13 09:22:00 +00:00
|
|
|
|
|
|
|
|
|
// ...
|
|
|
|
|
|
|
|
|
|
// adc1_num++;
|
|
|
|
|
// if(adc1_num >= LB_TIMES)
|
|
|
|
|
// {
|
|
|
|
|
// adc1_num = 0;
|
|
|
|
|
// for(j = 0; j < LB_TIMES-1; j++)//采样值由小到大排列
|
|
|
|
|
// {
|
|
|
|
|
// for(k = 0; k < LB_TIMES-j-1; k++)
|
|
|
|
|
// {
|
|
|
|
|
// if(adc1_v[k] > adc1_v[k+1])
|
|
|
|
|
// {
|
|
|
|
|
// tem = adc1_v[k];
|
|
|
|
|
// adc1_v[k] = adc1_v[k+1];
|
|
|
|
|
// adc1_v[k+1] = tem;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// for(uint8_t i = 1; i < LB_TIMES - 1; i++)
|
|
|
|
|
// {
|
|
|
|
|
// curadc1 = curadc1 + adc1_v[i];
|
|
|
|
|
// }
|
|
|
|
|
// curadc1 = curadc1 /((float)(LB_TIMES - 2));//去掉一个最大值和一个最小值求平均值
|
|
|
|
|
// // g_ptz.Voltage = curadc1;
|
|
|
|
|
// memset(adc1_v, 0, sizeof(adc1_v));//adc1_v 快速清零
|
|
|
|
|
// curadc1_out = curadc1;
|
|
|
|
|
// }
|
2025-09-13 10:04:22 +00:00
|
|
|
|
|
2025-09-13 09:22:00 +00:00
|
|
|
|
// return curadc1_out;
|
2025-09-13 10:04:22 +00:00
|
|
|
|
return curadc1;
|
2025-09-12 09:53:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
2025-09-13 09:22:00 +00:00
|
|
|
|
// //电流采集
|
|
|
|
|
// float ptz_Current_collect_adc1_task()
|
|
|
|
|
// {
|
|
|
|
|
// static float adc1_i[LB_TIMES];
|
|
|
|
|
// static float curadc0_out;
|
|
|
|
|
// static uint8_t adc0_num;
|
|
|
|
|
// int j,k;
|
|
|
|
|
// float tem;
|
|
|
|
|
// float curadc0;
|
|
|
|
|
// uint16_t value_I;
|
|
|
|
|
|
2025-09-13 10:04:22 +00:00
|
|
|
|
// adc_software_trigger_enable(ADCX,ADC_ROUTINE_CHANNEL);
|
|
|
|
|
// // adc_software_trigger_enable(ADCX,ADC_INSERTED_CHANNEL);
|
2025-09-13 09:22:00 +00:00
|
|
|
|
|
2025-09-13 10:04:22 +00:00
|
|
|
|
// // while(adc_flag_get(ADCX, ADC_FLAG_EOC) == RESET); // 等待转换结束
|
2025-09-13 09:22:00 +00:00
|
|
|
|
|
2025-09-13 10:04:22 +00:00
|
|
|
|
// value_I = adc_routine_data_read(ADCX); // 读取规则组数据寄存器
|
|
|
|
|
// // value_I = adc_inserted_data_read(ADCX, CURRENT_ADC_CHANNEL); // 读取规则组数据寄存器
|
2025-09-13 09:22:00 +00:00
|
|
|
|
|
2025-09-13 10:04:22 +00:00
|
|
|
|
// adc1_i[adc0_num] = (((float)value_I / 4095.0 * 3.3)-3.3/2) / 0.132;//(float)value_I;//
|
2025-09-13 09:22:00 +00:00
|
|
|
|
|
|
|
|
|
// adc0_num ++;
|
|
|
|
|
// if(adc0_num >= LB_TIMES)
|
|
|
|
|
// {
|
|
|
|
|
// adc0_num = 0;
|
|
|
|
|
// for(j = 0; j < LB_TIMES-1; j++)//采样值由小到大排列
|
|
|
|
|
// {
|
|
|
|
|
// for(k = 0; k < LB_TIMES-j-1; k++)
|
|
|
|
|
// {
|
|
|
|
|
// if(adc1_i[k] > adc1_i[k+1])
|
|
|
|
|
// {
|
|
|
|
|
// tem = adc1_i[k];
|
|
|
|
|
// adc1_i[k] = adc1_i[k+1];
|
|
|
|
|
// adc1_i[k+1] = tem;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// for(uint8_t i = 1; i < LB_TIMES - 1; i++)
|
|
|
|
|
// {
|
|
|
|
|
// curadc0 = curadc0 + adc1_i[i];
|
|
|
|
|
// }
|
|
|
|
|
// curadc0 = curadc0 /((float)(LB_TIMES - 2));//去掉一个最大值和一个最小值求平均值
|
|
|
|
|
// memset(adc1_i, 0, sizeof(adc1_i));
|
|
|
|
|
// curadc0_out = curadc0;
|
|
|
|
|
// }
|
|
|
|
|
// return curadc0_out;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|