以下是一个基本的线性读取摇杆数值的代码,使用 ADC 模块来读取 PA5 和 PA6 引脚的模拟电压值。

首先,需要初始化 ADC 模块和 GPIO 引脚:

#include "stm32f10x.h"

void ADC_Init(void)
{
    ADC_InitTypeDef ADC_InitStruct;
    GPIO_InitTypeDef GPIO_InitStruct;

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

    // PA5 和 PA6 设置为模拟输入引脚
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    // ADC1 配置为单通道模式,采样时间为 55.5 周期
    ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStruct.ADC_ScanConvMode = DISABLE;
    ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStruct.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStruct);

    ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_55Cycles5);
    ADC_Cmd(ADC1, ENABLE);
}

int main(void)
{
    ADC_Init();

    while (1)
    {
        // 启动 ADC 转换
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);

        // 等待转换完成
        while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);

        // 读取 PA5 和 PA6 引脚的模拟电压值
        uint16_t x_value = ADC_GetConversionValue(ADC1);

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);

        // 等待转换完成
        while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);

        uint16_t y_value = ADC_GetConversionValue(ADC1);

        // 进行线性映射
        int x_mapped = (x_value * 100) / 4096;
        int y_mapped = (y_value * 100) / 4096;

        // 在此处添加处理代码,例如将映射后的值发送到串口或者显示在 LCD 上

    }
}

在上面的代码中,我们使用了 ADC 模块来读取 PA5 和 PA6 引脚的模拟电压值。我们将 ADC1 配置为单通道模式,使用 ADC_Channel_5 通道来读取 PA5 引脚的电压值,使用 ADC_Channel_6 通道来读取 PA6 引脚的电压值。我们还设置了 ADC 的采样时间为 55.5 个时钟周期。

在主循环中,我们多次启动 ADC 转换,并等待转换完成。然后,我们使用线性映射将读取到的电压值映射到 0 到 100 的范围内。最后,我们可以在此处添加处理代码,例如将映射后的值发送到串口或者显示在 LCD 上。

STM32F103C8T6 线性读取摇杆数值代码 - PA5 和 PA6 引脚

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

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