• 《SLAM机器人基础教程》第三章 单片机与STM32:ADC与电压检测实验


    3.9节 ADC与电压检测实验

    本节介绍STM32的ADC模拟数字转换外设。

    a.实验准备:USB转串口模块,ST-Llink下载器,CHEAPX机器人控制板

    b.实验目的:STM32实现电源电压的数据采集

    c.相关知识点:

    d.编程及运行

    (1)初始化

    void initBattery(void)
    {     
        ADC_InitTypeDef ADC_InitStruct; 
        GPIO_InitTypeDef GPIO_InitStruct;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_ADC1, ENABLE );//使能GPIOC和ADC通道1的时钟
        RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频系数,频率为72M/6=12M
                   
      //配置GPIO    
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;    //模拟输入模式
        GPIO_Init(GPIOC, &GPIO_InitStruct);              //传入结构体GPIO_InitStruct,配置GPIO C0
        
        //配置ADC
        ADC_DeInit(ADC1);  //ADC1寄存器复位
        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数据右对齐
        ADC_InitStruct.ADC_NbrOfChannel = 1;    //ADC通道数
        ADC_Init(ADC1, &ADC_InitStruct);        //传入结构体ADC_InitStruct,配置ADC1 
        ADC_Cmd(ADC1, ENABLE);                  //开启ADC1
        
        ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));    //复位校准寄存器
        ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));          //校准ADC1
    
    }    

    (2)更新函数

    //获取ADC1通道channel转换值
    u16 BatteryUpdate(void)   
    {
      //配置通道,序列数和采样时间
        ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_71Cycles5 );    //ADC1,通道1,1个序列,71.5周期                      
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);           //开启换算    
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待换算结束
        
        return ADC_GetConversionValue(ADC1);             //返回转换结果
    }
          

    (3)主函数

    //ADC与电压检测实验
    int main(void)
    {        
        u16 adcx=0;
        u16 volt=0;
        
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //PriorityGroupConfig NVIC中断分组设置 组2(2位抢占优先级,2位响应优先级)
        initDebugSerial(500000);//初始化调试串口USART1,波特率500000
        initSysTick();//初始化滴答定时器和TIM4定时器
        showVersion();//显示版本
        initBattery();//初始化电池检测
        while(1)
        {
            adcx=BatteryUpdate();   //读取ADC返回值
            volt=adcx*2500/4096*7;  //转换成电压值:稳压参考值2500mV,ADC级数4096,电池分压采样比例2/14
            printf("Bat=%umV
    ",volt);    
            delay_ms(1000);
        }
        
    }

    (4)实验结果

  • 相关阅读:
    java加密解密用法
    进程和线程
    office使用技巧
    apktool+dex2jar+jd_gui
    shell编程学习
    编程常犯的错误
    编程语言学习清单
    使用github托管自己的项目
    c# 异常 的 异想
    DNLA自学(一) UPnP设备发现
  • 原文地址:https://www.cnblogs.com/Baron-Lu/p/13378707.html
Copyright © 2020-2023  润新知