GDF305单片机ADC驱动
#include "bsp.h"
#include "app.h"
#include "bsp_can.h"
#include "bsp_timer.h"
#include "bsp_usart.h"
#include "gd32f30x.h"
#include "bsp_key.h"
#include "driver.h"
#include <stdio.h>
uint16_t adc_value[2];
void adc_rcu_config(void);
void adc_gpio_config(void);
void adc_dma_config(void);
void adc_config(void);
/************************************************
函数名称 : adc_Initializes
功 能 : adc初始化
参 数 : 无
返 回 值 : 无
作 者 : SWUST Tom
*************************************************/
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
int adc_Initializes(void)
{
/* system clocks configuration */
adc_rcu_config();
/* GPIO configuration */
adc_gpio_config();
/* DMA configuration */
adc_dma_config();
/* ADC configuration */
adc_config();
for(int i=0;i<2;i++){
osDelay(100);
printf("\r\n //*******************************//");
// printf("\r\n ADC0 regular channel0 data = %04X", adc_value[0]);
// printf("\r\n ADC0 regular channel1 data = %04X", adc_value[1]);
float VADC_12 = 0.0;
float IADC_12 = 0.0;
VADC_12=(11*adc_value[0]*3.3/4096)+0.45;
IADC_12=330.0*adc_value[1]/4096;
printf("\r\n 电压 = %.2f V", VADC_12);
printf("\r\n 电流 = %.2f mA", IADC_12);
}
}
/************************************************
函数名称 : printf_12VADC_val
功 能 : 打印电压电流值
参 数 : 无
返 回 值 : 无
作 者 : SWUST Tom
*************************************************/
void printf_12VADC_val()
{
float VADC_12 = 0.0;
float IADC_12 = 0.0;
VADC_12=(11*adc_value[0]*3.3/4096)+0.45;
IADC_12=330.0*adc_value[1]/4096;
printf("\r\n 电压 = %.2f V", VADC_12);
printf("\r\n 电流 = %.2f mA", IADC_12);
}
/************************************************
函数名称 : adc_Initializes
功 能 : 获取打印电压
参 数 : 无
返 回 值 : 无
作 者 : SWUST Tom
*************************************************/
float get_12VADC_val()
{
float VADC_12 = 0.0;
VADC_12=(11*adc_value[0]*3.3/4096)+0.45;
printf("\r\n 电压 = %.2f V", VADC_12);
return VADC_12;
}
/************************************************
函数名称 : get_12IADC_val
功 能 : 获取打印电流值
参 数 : 无
返 回 值 : 无
作 者 : SWUST Tom
*************************************************/
float get_12IADC_val()
{
float IADC_12 = 0.0;
IADC_12=330.0*adc_value[1]/4096;
printf("\r\n 电流 = %.2f mA", IADC_12);
return IADC_12;
}
/*!
\brief configure the different system clocks
\param[in] none
\param[out] none
\retval none
*/
void adc_rcu_config(void)
{
/* enable GPIOA clock */
rcu_periph_clock_enable(RCU_GPIOC);
/* enable ADC clock */
rcu_periph_clock_enable(RCU_ADC0);
/* enable DMA0 clock */
rcu_periph_clock_enable(RCU_DMA0);
/* config ADC clock */
rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);
}
/*!
\brief configure the GPIO peripheral
\param[in] none
\param[out] none
\retval none
*/
void adc_gpio_config(void)
{
/* config the GPIO as analog mode */
gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_0);//pc0,电压
gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_1);//PC1电流
}
/*!
\brief configure the DMA peripheral
\param[in] none
\param[out] none
\retval none
*/
void adc_dma_config(void)
{
/* ADC_DMA_channel configuration */
dma_parameter_struct dma_data_parameter;
/* ADC DMA_channel configuration */
dma_deinit(DMA0, DMA_CH0);
/* initialize DMA single data mode */
dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC0));
dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_data_parameter.memory_addr = (uint32_t)(&adc_value);
dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT;
dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY;
dma_data_parameter.number = 2;//两个通道
dma_data_parameter.priority = DMA_PRIORITY_HIGH;
dma_init(DMA0, DMA_CH0, &dma_data_parameter);
dma_circulation_enable(DMA0, DMA_CH0);
/* enable DMA channel */
dma_channel_enable(DMA0, DMA_CH0);
}
/*!
\brief configure the ADC peripheral
\param[in] none
\param[out] none
\retval none
*/
void adc_config(void)
{
/* ADC mode config */
adc_mode_config(ADC_MODE_FREE);
/* ADC continuous function enable */
adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);
/* ADC scan function enable */
adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
/* ADC data alignment config */
adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
/* ADC channel length config */
adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 2);//通道个数
/* ADC regular channel config */
adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_10, ADC_SAMPLETIME_55POINT5);//通道10,电压
adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_11, ADC_SAMPLETIME_55POINT5);//通道11,电流
/* ADC trigger config */
adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
/* ADC DMA function enable */
adc_dma_mode_enable(ADC0);
/* enable ADC interface */
adc_enable(ADC0);
osDelay(1);
/* ADC calibration and reset calibration */
adc_calibration_enable(ADC0);
/* ADC software trigger enable */
adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
}
GD32F427单片机ADC驱动
#include "bsp.h"
#include "app.h"
#include "bsp_can.h"
#include "bsp_timer.h"
#include "bsp_usart.h"
#include "gd32f4xx.h"
#include "bsp_key.h"
#include "driver.h"
#include <stdio.h>
uint32_t adc_value[2];
void adc_rcu_config(void);
void adc_gpio_config(void);
void adc_dma_config(void);
void adc_config(void);
/************************************************
函数名称 : adc_Initializes
功 能 : adc初始化
参 数 : 无
返 回 值 : 无
作 者 : SWUST Tom
*************************************************/
/*!
\brief main function
\param[in] none
\param[out] none
\retval none
*/
int adc_Initializes(void)
{
/* system clocks configuration */
adc_rcu_config();
/* GPIO configuration */
adc_gpio_config();
/* DMA configuration */
adc_dma_config();
/* ADC configuration */
adc_config();
for(int i=0;i<2;i++){
osDelay(100);
printf("\r\n //*******************************//");
// printf("\r\n ADC0 regular channel0 data = %04X", adc_value[0]);
// printf("\r\n ADC0 regular channel1 data = %04X", adc_value[1]);
float VADC_12 = 0.0;
float IADC_12 = 0.0;
VADC_12=(11*adc_value[0]*3.3/4096)+0.45;
IADC_12=330.0*adc_value[1]/4096;
printf("\r\n 电压 = %.2f V", VADC_12);
printf("\r\n 电流 = %.2f mA", IADC_12);
}
}
/************************************************
函数名称 : printf_12VADC_val
功 能 : 打印电压电流值
参 数 : 无
返 回 值 : 无
作 者 : SWUST Tom
*************************************************/
void printf_12VADC_val()
{
float VADC_12 = 0.0;
float IADC_12 = 0.0;
VADC_12=(11*adc_value[0]*3.3/4096)+0.45;
IADC_12=330.0*adc_value[1]/4096;
printf("\r\n 电压 = %.2f V", VADC_12);
printf("\r\n 电流 = %.2f mA", IADC_12);
adc_value[0]=0;
adc_value[1]=0;
}
/************************************************
函数名称 : adc_Initializes
功 能 : 获取打印电压
参 数 : 无
返 回 值 : 无
作 者 : SWUST Tom
*************************************************/
float get_12VADC_val()
{
float VADC_12 = 0.0;
VADC_12=(11*adc_value[0]*3.3/4096)+0.45;
printf("\r\n 电压 = %.2f V", VADC_12);
adc_value[0]=0;
return VADC_12;
}
/************************************************
函数名称 : get_12IADC_val
功 能 : 获取打印电流值
参 数 : 无
返 回 值 : 无
作 者 : SWUST Tom
*************************************************/
float get_12IADC_val()
{
float IADC_12 = 0.0;
IADC_12=330.0*adc_value[1]/4096;
printf("\r\n 电流 = %.2f mA", IADC_12);
adc_value[1]=0;
return IADC_12;
}
/*!
\brief configure the different system clocks
\param[in] none
\param[out] none
\retval none
*/
void adc_rcu_config(void)
{
/* enable GPIOA clock */
rcu_periph_clock_enable(RCU_GPIOC);
/* enable ADC clock */
rcu_periph_clock_enable(RCU_ADC0);
/* enable DMA0 clock */
rcu_periph_clock_enable(RCU_DMA1);
/* config ADC clock */
adc_clock_config(ADC_ADCCK_HCLK_DIV5);
}
/*!
\brief configure the GPIO peripheral
\param[in] none
\param[out] none
\retval none
*/
void adc_gpio_config(void)
{
/* config the GPIO as analog mode */
gpio_mode_set(GPIOC,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,GPIO_PIN_0);//pc0,电压
gpio_mode_set(GPIOC,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,GPIO_PIN_1);//PC1电流
}
/*!
\brief configure the DMA peripheral
\param[in] none
\param[out] none
\retval none
*/
void adc_dma_config(void)
{
/* ADC_DMA_channel configuration */
dma_single_data_parameter_struct dma_data_parameter;
/* ADC DMA_channel configuration */
dma_deinit(DMA1, DMA_CH0);
/* initialize DMA single data mode */
dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC0));
//dma_data_parameter.periph_addr = (uint32_t)(&ADC_SYNCDATA);
dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_data_parameter.memory0_addr = (uint32_t)(&adc_value);
dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_32BIT;
dma_data_parameter.circular_mode = DMA_CIRCULAR_MODE_ENABLE;
dma_data_parameter.direction = DMA_PERIPH_TO_MEMORY;
dma_data_parameter.number = 2;//两个通道
dma_data_parameter.priority = DMA_PRIORITY_HIGH;
dma_single_data_mode_init(DMA1, DMA_CH0, &dma_data_parameter);
/* DMA channel 0 peripheral select */
dma_channel_subperipheral_select(DMA1, DMA_CH0,DMA_SUBPERI0);
/* enable DMA channel */
dma_channel_enable(DMA1, DMA_CH0);
dma_circulation_enable(DMA1, DMA_CH0);
}
/*!
\brief configure the ADC peripheral
\param[in] none
\param[out] none
\retval none
*/
void adc_config(void)
{
/* ADC mode config */
adc_sync_mode_config(ADC_SYNC_MODE_INDEPENDENT);
/* ADC continuous function enable */
adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);
/* ADC scan function enable */
adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
/* ADC data alignment config */
adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
adc_resolution_config(ADC0,ADC_RESOLUTION_12B);
/* ADC channel length config */
adc_channel_length_config(ADC0, ADC_ROUTINE_CHANNEL, 2);//通道个数
/* ADC regular channel config */
adc_routine_channel_config(ADC0, 0, ADC_CHANNEL_10, ADC_SAMPLETIME_15);//通道10,电压
adc_routine_channel_config(ADC0, 1, ADC_CHANNEL_11, ADC_SAMPLETIME_15);//通道11,电流
/* ADC trigger config */
adc_external_trigger_config(ADC0, ADC_ROUTINE_CHANNEL, EXTERNAL_TRIGGER_DISABLE);
// adc_external_trigger_source_config(ADC0, ADC_ROUTINE_CHANNEL, EXTERNAL_TRIGGER_RISING);
//adc_external_trigger_config(ADC0,ADC_REGULAR_CHANNEL,EXTERNAL_TRIGGER_DISABLE);
//adc_external_trigger_config(ADC0, ADC_ROUTINE_CHANNEL, EXTERNAL_TRIGGER_DISABLE);
/* ADC DMA function enable */
adc_dma_request_after_last_enable(ADC0);
adc_dma_mode_enable(ADC0);
/* enable ADC interface */
adc_enable(ADC0);
osDelay(1);
/* ADC calibration and reset calibration */
adc_calibration_enable(ADC0);//acd 校验
/* ADC software trigger enable */
adc_software_trigger_enable(ADC0, ADC_ROUTINE_CHANNEL);
}