STM32自学笔记(七)ADC

1)编写adc.c文件

编写adc.c文件,里面放以下三个函数

1. Adc_Init (void):用于ADC的初始化,需要在main()中调用一次。       

(需要根据具体情况修改,在第四节会讲如何修改)

2.Get_Adc(ch):读取某个通道的AD采样值。传递参数直接填通道名,例如通道1:ADC_Channel_1

(需要根据具体情况修改,在第五节会讲如何修改)

3.Get_Adc_Average(ch,times):也是读取某个通道的AD采样值,只不过取多次的平均值,提高准确度

 #include "adc.h"
 #include "delay.h"
//初始化 ADC 
//这里我们仅以规则通道为例 
//我们默认将开启通道 0~3               
void  Adc_Init(void) 
{  
    ADC_InitTypeDef ADC_InitStructure;   
    GPIO_InitTypeDef GPIO_InitStructure; 
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | 
                           RCC_APB2Periph_ADC1 , ENABLE );    //使能 ADC1 通道时钟  
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);  	//设置 ADC 分频因子 6  
    									//72M/6=12,ADC 最大时间不能超过 14M  
    //PA1 作为模拟通道输入引脚                           
    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入  
    GPIO_Init(GPIOA, &GPIO_InitStructure);         //初始化 GPIOA.1 
 
    ADC_DeInit(ADC1);  //复位 ADC1,将外设 ADC1 的全部寄存器重设为缺省值  
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC 独立模式  
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;     //单通道模式  
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //单次转换模式  
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//转换由 
    													//软件而不是外部触发启动  
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC 数据右对齐  
    ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目  
    ADC_Init(ADC1, &ADC_InitStructure);     //根据指定的参数初始化外设 ADCx    
    
    ADC_Cmd(ADC1, ENABLE);             //使能指定的 ADC1  
    ADC_ResetCalibration(ADC1);             //开启复位校准    
    while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束  
    ADC_StartCalibration(ADC1);             //开启 AD 校准  
    while(ADC_GetCalibrationStatus(ADC1));     //等待校准结束 
}       
    //获得 ADC 值 
    //ch:通道值 0~3 
    u16 Get_Adc(u8 ch)    
    {    
        //设置指定 ADC 的规则组通道,设置它们的转化顺序和采样时间 
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );  
        							//通道 1,规则采样顺序值为 1,采样时间为 239.5 周期     
        ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能软件转换功能   
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束  
        return ADC_GetConversionValue(ADC1); //返回最近一次 ADC1 规则组的转换结果 
    } 
    u16 Get_Adc_Average(u8 ch,u8 times) 
    {  
        u32 temp_val=0;  
        u8 t;  
        for(t=0;t<times;t++)  
        {   
            temp_val+=Get_Adc(ch);   
            delay_ms(5);  
        }  
        return temp_val/times; 
    } 

 

2)编写adc.h文件

只需声明adc.c中三个函数即可

#ifndef __ADC_H
#define __ADC_H	
#include "sys.h"

void Adc_Init(void);
u16  Get_Adc(u8 ch); 
u16 Get_Adc_Average(u8 ch,u8 times); 
 
#endif 

3)在main()使用ADC

(1)ADC初始化

直接调用adc.c中的初始化函数即可

Adc_Init();       //ADC 初始化 

(2)读取ADC值

调用adc.c中的Get_Adc_Average(ch,times)

u16 adcx
...
adcx=Get_Adc_Average(ADC_Channel_1,10);  

将ADC值赋给了16位变量adcx

(3)转换为电压值

STM32的ADC为12位,参考电压为Vref

因此电压值为:V = adcx * (Vref / 4096)

但有一个需要注意的地方,前面定义的 adcx 是一个16位整型变量,而电压值是有小数的,因此需要一个float型变量来保存电压值,并通过一定技巧得到整数部分和小数部分。代码如下:

float temp
...
temp=(float)adcx*(3.3/4096);      //转换后得到的电压值 
adcx=temp;            //电压值的整数部分  float型赋给整型,结果是保留了整数部分
temp-=adcx;           //电压值的小数部分
temp*=1000;           //小数部分*1000变为整型,方便LCD显示

adcx为电压值的整数部分,temp为电压值的小数部分

4)根据配置情况修改Adc_Init (void)

stm32有多个ADC,每个ADC又有多个通道,要根据具体使用情况进行相关配置

上文代码使用了ADC1的通道1,对应的GPIO是PA1,因此GPIO的配置是按照PA1来设置的。若使用了其他通道,则需要改成对应的GPIO。

STM32F103的ADC通道与GPIO对应表如下(其余型号自己翻datesheet找下)

需要修改的代码在下面列出了

//这里用的是PA1,根据具体GPIO修改
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | 
                           RCC_APB2Periph_ADC1 , ENABLE );    //使能 ADC1 通道时钟
  
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1; 

GPIO_Init(GPIOA, &GPIO_InitStructure);         //初始化 GPIOA.1  

//这里用的是ADC1,根据具体情况改成ADCx
ADC_DeInit(ADC1);  //复位 ADC1,将外设 ADC1 的全部寄存器重设为缺省值  
 
ADC_Init(ADC1, &ADC_InitStructure);     //根据指定的参数初始化外设 ADCx  
    
ADC_Cmd(ADC1, ENABLE);             //使能指定的 ADC1  
    
ADC_ResetCalibration(ADC1);             //开启复位校准    
    
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束  
    
ADC_StartCalibration(ADC1);             //开启 AD 校准  
    
while(ADC_GetCalibrationStatus(ADC1));     //等待校准结束 

5)根据配置情况修改Get_Adc(ch)

参见上面修改Adc_Init (void)的方法,把ADC1都改为ADCx

  • 12
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 《STM32自学笔记第3版》是一本关于STM32微控制器的自学教程。该书深入介绍了STM32微控制器的原理、应用和编程方法。 本书第3版增加了最新的STM32系列微控制器的内容,包括了更多实际应用的案例和项目。读者通过该书可以学习到如何使用STM32微控制器进行各种应用开发,如控制系统、嵌入式系统、通讯系统等。 本书首先对STM32微控制器的硬件结构进行了详细的介绍,包括了芯片的内部结构、引脚的功能和特性。然后,通过具体的实验项目,教授了STM32的基本编程方法和技巧。读者可以通过这些实验,了解STM32的各种功能模块的使用方法,如ADC、USART、SPI等。同时,还介绍了如何使用STM32CubeMX和Keil MDK等常用的开发工具进行项目开发。 此外,本书还对STM32的外设扩展进行了介绍,如通过I2C总线连接外部设备,通过CAN总线实现通讯等。读者可以学习到如何通过外设扩展,实现更复杂的应用系统。 总的来说,《STM32自学笔记第3版》是一本系统、全面的STM32自学教程。通过学习该书,读者可以深入了解STM32微控制器,并掌握其在各种应用领域的开发方法。无论是初学者还是有一定STM32开发经验的人都可以从中获益。 ### 回答2: 《STM32自学笔记 第3版》是一本适合自学STM32开发板的参考书籍。本书以STM32微控制器为基础,详细介绍了STM32的硬件结构和软件开发环境。作者结合自身经验和实际案例,将复杂的知识点以简洁明了的方式呈现,使读者能够快速入门。 第3版的内容相比前两版有所扩充和更新。首先,在硬件方面,本书详细介绍了STM32的引脚布局和外设接口,包括GPIO、USART、I2C、SPI等,使读者能够充分了解STM32的基本硬件结构和功能。 其次,在软件方面,本书提供了详细的开发环境配置和编程指南。包括了Keil MDK开发环境的安装和使用、编译、调试和下载等操作步骤,并且给出了一些常见问题的解决方法。同时,作者还介绍了如何使用STM32的标准外设库进行编程,包括GPIO控制、中断处理、定时器、串口通信等。 除此之外,本书还介绍了一些实际应用案例,以帮助读者更好地理解和应用所学知识。例如,如何使用STM32控制LED灯、驱动液晶显示屏、读取温度传感器数据等。 总体而言,本书是一本系统全面的STM32自学教程。通过学习本书,读者可以了解STM32的基本原理和应用,掌握STM32的硬件配置和软件开发,从而能够独立完成STM32的项目开发。无论是初学者还是有一定基础的开发者都可以从本书中获得很大的收益。 ### 回答3: 《STM32自学笔记第3版》是一本专门介绍如何自学STM32开发的书籍。本书主要针对初学者,通过详细的讲解和实践项目的演示,帮助读者快速上手STM32开发。 书中首先介绍了STM32系列微控制器的基本知识,包括硬件架构、外设功能和寄存器的使用等。对于没有接触过STM32的读者来说,这一部分对于理解后面的内容非常重要。 接着,书中从简单的LED控制开始,逐步引导读者学习各种外设的使用,如GPIO、定时器、UART等。同时,每个外设的使用都配有具体的实例代码和详细的注解,方便读者理解和实践。 书中还介绍了STM32开发中常用的开发工具和环境配置方法。从芯片选择、开发板选购到软件安装和项目配置,都有详细的指导。同时,书中还提供了一些调试技巧和常见问题的解答,帮助读者避开一些容易遇到的坑。 最后,书中还介绍了一些常用的外设应用案例,如按键控制、LCD显示、温湿度传感器等。通过这些案例,读者可以更好地理解STM32的应用场景和开发思路,提升自己的技能水平。 总的来说,《STM32自学笔记第3版》是一本适合学习STM32开发的入门书籍。通过系统完整的内容和实例演示,读者可以快速掌握STM32的基本知识和开发技巧。无论是初学者还是有一定经验的开发者,都可以从中获得实际的帮助和启示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值