STM32F103C8T6 ADC1 采样程序:高速连续采样与低速规则采样

本程序使用STM32F103C8T6芯片的ADC1完成ADC采样任务,实现通道1高速连续采样(周期小于10us)和通道2低速规则采样(周期50ms)。

程序要求

  • 通道1: 连续转换,周期在10us以内,可以使用注入通道
  • 通道2: 50ms转换一次,优先级不高,甚至100ms转换一次也是可以接受的,可以使用规则通道

程序示例

#include "stm32f10x.h"

void ADC1_Init(void);
void ADC1_Start(void);

volatile uint16_t ch1_result = 0;
volatile uint16_t ch2_result = 0;

int main(void) {
    ADC1_Init();

    while (1) {
        ADC1_Start();
        // 等待ADC转换完成
        while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
        // 获取转换结果
        ch1_result = ADC_GetConversionValue(ADC1);

        // 延时50ms
        for (int i = 0; i < 5000; i++) {
            for (int j = 0; j < 7200; j++) {
                asm("nop");
            }
        }

        // 再次开始ADC转换
        ADC1_Start();
        // 等待ADC转换完成
        while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
        // 获取转换结果
        ch2_result = ADC_GetConversionValue(ADC1);
    }
}

void ADC1_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    ADC_InitTypeDef ADC_InitStructure;

    // 使能ADC1时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    // 使能GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 配置ADC1通道1引脚(PA1)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // ADC1配置为独立工作模式
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    // ADC1时钟选择为PCLK2的8分频,即9MHz
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStructure);

    // 配置ADC1规则通道1,采样时间为55.5个时钟周期
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);

    // 使能ADC1
    ADC_Cmd(ADC1, ENABLE);

    // ADC1校准
    ADC_ResetCalibration(ADC1);
    while (ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while (ADC_GetCalibrationStatus(ADC1));
}

void ADC1_Start(void) {
    // 启动ADC1规则转换
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

代码说明

这段程序设置了ADC1通道1为连续转换模式,周期不超过10us,使用了规则通道进行转换。同时,在主循环中,每隔50ms进行一次ADC转换,获取通道1和通道2的转换结果。

  • 通道1: 使用ADC1的规则通道,设置连续转换模式,并通过ADC_SampleTime_55Cycles5设置采样时间,确保转换周期在10us以内。
  • 通道2: 在主循环中,每隔50ms使用ADC_SoftwareStartConvCmd启动ADC转换,获取转换结果。

注意

  • 此示例程序仅供参考,您可能需要根据您的具体需求进行修改和优化。
  • 需要根据您的实际硬件连接情况,适当修改GPIO引脚的配置。
  • 为了更好地理解程序,建议您参考STM32F103C8T6的参考手册。

总结

本程序实现了STM32F103C8T6芯片的ADC1高速连续采样和低速规则采样的功能,并提供了详细的代码说明。希望本程序能够帮助您更好地理解和应用STM32F103C8T6的ADC功能。

STM32F103C8T6 ADC1 采样程序:高速连续采样与低速规则采样

原文地址: https://www.cveoy.top/t/topic/br7E 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录