92 lines
2.4 KiB
C
92 lines
2.4 KiB
C
|
#include "drv_adc.h"
|
|||
|
#include "stdlib.h"
|
|||
|
#include "string.h"
|
|||
|
#include "gd32f4xx.h"
|
|||
|
#include "rtthread.h"
|
|||
|
|
|||
|
|
|||
|
#define ADC_BASIC 3300
|
|||
|
|
|||
|
void ADC_Init()
|
|||
|
{
|
|||
|
//配置引脚时钟
|
|||
|
rcu_periph_clock_enable(RCU_GPIOC);
|
|||
|
//引脚复用,PC2——电压ADC1-CH12,PC3——电流ADC1-CH13
|
|||
|
gpio_mode_set(GPIOC,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,GPIO_PIN_2);
|
|||
|
gpio_mode_set(GPIOC,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,GPIO_PIN_3);
|
|||
|
|
|||
|
rcu_periph_clock_enable(RCU_ADC1);
|
|||
|
//总线时钟20分频=6MHZ
|
|||
|
adc_clock_config(ADC_ADCCK_PCLK2_DIV4);
|
|||
|
/***********************************************/
|
|||
|
|
|||
|
|
|||
|
//对齐方式 ADC_INSERTED_CHANNEL
|
|||
|
adc_data_alignment_config(ADC1,ADC_DATAALIGN_RIGHT);
|
|||
|
//扫描模式
|
|||
|
adc_special_function_config(ADC1,ADC_SCAN_MODE,ENABLE);
|
|||
|
//外部触发关闭
|
|||
|
adc_external_trigger_config(ADC1,ADC_INSERTED_CHANNEL,DISABLE);
|
|||
|
//采集通道数
|
|||
|
adc_channel_length_config(ADC1,ADC_INSERTED_CHANNEL,2);
|
|||
|
|
|||
|
//通道注入顺序
|
|||
|
adc_inserted_channel_config(ADC1,0,ADC_CHANNEL_13,ADC_SAMPLETIME_480);//电流
|
|||
|
adc_inserted_channel_config(ADC1,1,ADC_CHANNEL_12,ADC_SAMPLETIME_480);//电压
|
|||
|
|
|||
|
|
|||
|
adc_enable(ADC1);
|
|||
|
|
|||
|
adc_calibration_enable(ADC1);
|
|||
|
}
|
|||
|
|
|||
|
//电压采集
|
|||
|
float ptz_Voltage_collect_adc1_task()
|
|||
|
{
|
|||
|
static float adc1_v[5];
|
|||
|
static unsigned char adc1_num;
|
|||
|
int j,k;
|
|||
|
float tem;
|
|||
|
float curadc1;
|
|||
|
uint16_t value_V;
|
|||
|
//软件触发使能
|
|||
|
adc_software_trigger_enable(ADC1,ADC_INSERTED_CHANNEL);
|
|||
|
value_V = ADC_IDATA1(ADC1);
|
|||
|
|
|||
|
adc1_v[adc1_num] = (float)value_V / 4096.0 * 11 *3.3;//(float)value_V;//
|
|||
|
adc1_num++;
|
|||
|
if(adc1_num >= 5)
|
|||
|
{
|
|||
|
adc1_num = 0;
|
|||
|
for(j = 0; j < 5-1; j++)//采样值由小到大排列
|
|||
|
{
|
|||
|
for(k = 0; k < 5-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 < 5 - 1; i++)
|
|||
|
{
|
|||
|
curadc1 = curadc1 + adc1_v[i];
|
|||
|
}
|
|||
|
curadc1 = curadc1 /((float)(5 - 2));//去掉一个最大值和一个最小值求平均值
|
|||
|
// g_ptz.Voltage = curadc1;
|
|||
|
memset(adc1_v,0,sizeof(adc1_v));
|
|||
|
return curadc1;
|
|||
|
// rt_kprintf("ADC Channel value: %f\n", curadc1);
|
|||
|
// pdebug(DEBUG_LEVEL_INFO,"get ptz Voltage: %.3fV",g_ptz.Voltage);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void init_data_collect_module(void)
|
|||
|
{
|
|||
|
ADC_Init();//AD采集引脚初始化
|
|||
|
// temp75_gpio_init();//温度传感器初始化
|
|||
|
// creat_task_data_collect();
|
|||
|
}
|