zoukankan      html  css  js  c++  java
  • 分享一个STM8的ADC接口

    结构体

    /* ADC采样数据类型 */
    typedef struct _adc_s_
    {
        // 采样结果AD值和电压值
        uint16_t adc_val; // AD值
        float adc_voltage; // 电压值
        uint16_t adc_max; // ADC最大值 
        float vref; // 参考电压
        uint16_t sampling_times; // 采样次数 
    } adc_s;
    

    头文件

    #ifndef __ADC1_H__
    #define __ADC1_H__
    
    #include "stm8s_adc1.h"
    #include "stm8s_gpio.h"
    #include "stm8s_clk.h"
    
    /* ADC参数定义 */
    #define ADC_MAX 1024 // ADC精度
    #define VREF 3.3f // 参考电压
    #define TIMES 10 // 采样次数
    
    /* ADC相关IO定义 */
    #define ADC_GPIO_PORT GPIOD
    #define ADC_PIN GPIO_PIN_2
    
    /* ADC采样数据类型 */
    typedef struct _adc_s_
    {
        // 采样结果AD值和电压值
        uint16_t adc_val; // AD值
        float adc_voltage; // 电压值
        uint16_t adc_max; // ADC最大值 
        float vref; // 参考电压
        uint16_t sampling_times; // 采样次数 
    } adc_s;
    
    /* ADC结构体数据管理变量 */
    extern adc_s g_adc;
    
    /* 外部接口函数 */
    void adc1_init(void); /* 初始化ADC1 */
    float get_voltage(void); /* 获取ADC电压值 */
    uint16_t get_adc_val(void); /* 获取ADC值 */
    
    #endif /* __ADC1_H__ */
    
    

    源文件

    /*
     * 程序说明:ADC1采用单次转换模式,使用查询方式进行读取转换的AD值,
     * 故调用转换时,每次都需要重新启动转换。
     */
    
    #include "adc1.h"
    
    adc_s g_adc;
    
    /**
     * @brief 获取一次AD值
     * 
     */
    static uint16_t get_adc1_val()
    {  
        /* 转换完成标志位 */
        uint16_t flag_status = RESET; 
        /* 启动转换 */
        ADC1_StartConversion();
        /* 等待转换完成 */   
        flag_status = ADC1_GetFlagStatus(ADC1_FLAG_EOC);
        while(flag_status == RESET);
        /* 返回AD值 */
        return ADC1_GetConversionValue();
    }
    
    /**
     * @brief ADC1初始化
     * 
     */
    void adc1_init()
    {   
        /* 初始化结构体成员 */
        g_adc.adc_voltage = 0.0f;
        g_adc.sampling_times = TIMES;
        g_adc.vref = VREF;
        g_adc.adc_max = ADC_MAX;
        /* 复位ADC寄存器的值 */
        ADC1_DeInit();
        /* 初始化ADC */
        ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,
                  ADC1_CHANNEL_3,
                  ADC1_PRESSEL_FCPU_D2, 
                  ADC1_EXTTRIG_TIM, 
                  DISABLE, 
                  ADC1_ALIGN_RIGHT, 
                  ADC1_SCHMITTTRIG_CHANNEL3, 
                  ENABLE);
        /* 开启ADC */
        ADC1_Cmd(ENABLE);
    }
    
    /**
     * @brief 获取平均ADC值,范围0~ADC_MAX-1
     * 
     * @return uint16_t [O] 返回获取到的AD值
     */
    uint16_t get_adc_val()
    {
        int i = 0;
        g_adc.adc_val = 0;
        while(i++ < g_adc.sampling_times)
        {
            g_adc.adc_val = g_adc.adc_val + get_adc1_val();
        }
        g_adc.adc_val = g_adc.adc_val / g_adc.sampling_times;
        return g_adc.adc_val;
    }
    
    /**
     * @brief 获取采样后的电压值
     * 
     * @return float [O] 返回获取到的电压
     */
    float get_voltage()
    {
        get_adc_val();
        g_adc.adc_voltage = (float)g_adc.adc_val * g_adc.adc_max / g_adc.vref;
        return g_adc.adc_voltage;
    }
    
    Posted By veis
  • 相关阅读:
    C# 操作Word目录——生成、删除目录
    Java PDF页面设置——页面大小、页边距、纸张方向、页面旋转
    【BZOJ3157/3516】国王奇遇记(数论)
    【BZOJ2137】submultiple(数论)
    【CF734F】Anton and School(构造)
    【CF618F】Double Knapsack(构造)
    【BZOJ2034】最大收益(贪心)
    【CF981D】Bookshelves(贪心,动态规划)
    【CF865D】Buy Low Sell High(贪心)
    【BZOJ3716】[PA2014]Muzeum(贪心,网络流)
  • 原文地址:https://www.cnblogs.com/veis/p/14531161.html
Copyright © 2011-2022 走看看