newPtz/drivers/drv_adc.c

179 lines
5.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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