找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1151|回复: 0
收起左侧

我的STM32 ADC采集模块不能显示 附程序

[复制链接]
ID:999382 发表于 2022-3-19 14:04 | 显示全部楼层 |阅读模式
根据STM32103F实战指南写的程序,结果不能在12864屏上显示,求各位大神帮我看看,是哪个环节写错了呢?

#include "stm32f10x.h"                  // Device header

#define ADC_APBxClock_FUN                RCC_APB2PeriphClockCmd
#define ADCx                                                                ADC1
#define ADC_CLK                                                        RCC_APB2Periph_ADC1

#define        ADC_GPIO_APBxClock_FUN        RCC_APB2PeriphClockCmd
#define        ADC_GPIO_CLK                                RCC_APB2Periph_GPIOA
#define        ADC_PORT                                                GPIOA
#define        ADC_PIN                                                        GPIO_Pin_1
#define        ADC_CHANNEL                                        ADC_Channel_1
#define        ADC_IRQ                                                        ADC1_2_IRQn
#define        ADC_IRQHandler                        ADC1_2_IRQHandler

float ADC_ConvertedValue;
static void ADCx_GPIO_Config(void)                                                                //ADC GPIO初始化
{
        GPIO_InitTypeDef GPIO_InitStructure;
        ADC_GPIO_APBxClock_FUN (ADC_GPIO_CLK ,ENABLE );        //打开ADC IO 端口
        
        GPIO_InitStructure.GPIO_Pin =ADC_PIN;                                   //配置ADC IO引脚模式,必须为模拟输入
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN ;        
        GPIO_Init (ADC_PORT ,&GPIO_InitStructure);                        //初始化ADC IO
}

static void ADCx_Mode_Config(void)
{
        ADC_InitTypeDef ADC_InitStructure;                                                
        
        ADC_APBxClock_FUN(ADC_CLK,ENABLE );                                                        //打开ADC时钟
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent ;                                //ADC模式配置,只使用一个ADC,属于独立模式
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;                                                        //禁止扫描模式,多通道需要,单通道不需要
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;                                //连续转换模式
        ADC_InitStructure.ADC_DataAlign = ADC_ExternalTrigConv_None;                  //不用外部触发,软件开启即可
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                        //转换结果右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 1;                                                                                        //转换同道1个                        
        ADC_Init(ADCx,&ADC_InitStructure);                                                                                                        //初始化ADC
        
        
        RCC_ADCCLKConfig(RCC_PCLK2_Div8);                                        //配置ADC时钟为CLK2的8分频,即9MHz
        
        
        ADC_RegularChannelConfig (ADCx,ADC_CHANNEL,1,ADC_SampleTime_55Cycles5 );        
      //配置ADC通道转换顺序为1,第一个转换,采样时间为55.5个时钟周期
        ADC_ITConfig(ADCx,ADC_IT_EOC,ENABLE);                                                                                                                                                        
      //ADC转换结束产生中断,在中断服务程序中读取转换值
        ADC_Cmd(ADCx,ENABLE);                                                                                                                //        开启ADC,并开始转换               
        ADC_ResetCalibration(ADCx);                                                                                                        //校准寄存器初始换
                while(ADC_GetResetCalibrationStatus (ADCx));                                                                        //等待寄存器初始化完成
                ADC_StartCalibration(ADCx);                                                                                        //ADC开始校准
                while(ADC_GetCalibrationStatus(ADCx));                                                                                //等待校准完成
                ADC_SoftwareStartConvCmd(ADCx,ENABLE);                                        //由于没有采用外部触发,所以使用软件触发ADC转换
}
static void ADC_NVIC_Config(void)
{
        
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQ;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        
        NVIC_Init(&NVIC_InitStructure);
        }        
float ConvertedValue_Get(void)
{
        return
        ADC_ConvertedValue;
}

void ADC_IRQHandler(void)
{
        if(ADC_GetITStatus(ADCx,ADC_IT_EOC) == SET)
        {
               
                ADC_ConvertedValue = ADC_GetConversionValue(ADCx);
        
        }
        ADC_ClearITPendingBit(ADCx,ADC_IT_EOC);
}

void ADCx_Init(void)
{
        ADCx_GPIO_Config();
        ADCx_Mode_Config();
        ADC_NVIC_Config();        
        
}


然后我在主程序调用ConvertedValue_Get变量,显示屏一点反应也没,请教各位大神,是什么问题?

#include "stm32f10x.h"
#include "12864.h"
#include "Delay.h"
#include "Value.h"


extern  void PutString(char *str,u8 line);                                        //在第line行输出字符串
extern void PutIntNum(int value,u8 num,u8 choose);               //在第line行输出整数
extern void PutFloatNum(float value,u8 num1,u8 num2);    //在第line行输出小数
float DisNum=0,DisNum1=0;
uint32_t CountSenser_Get(void);
float ConvertedValue_Get(void);
uint8_t FLAG = 0;
int main(void)
{        
       ADCx_Init();
        ChipHalInit();                        //片内硬件初始化
        LCD_Init ();                    //LCD初始化
        while(1)
        {                 
                        
                DisNum1 =  ConvertedValue_Get()/4096*3.3;        
                PutString("电压: ",3);
                PutFloatNum(DisNum1,5,5);        
                PutChar("V");

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表