GDF305单片机ADC驱动和GD32F427单片机ADC驱动

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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值