一、实验目的与任务
实验目的:
1. 学习对ADC基础功能的使用;
2. 掌握KEIL5的仿真与调试。
任务:
1. 根据要求编写程序,并写出原理性注释;
2. 将检查程序运行的结果,分析一下是否正确;
3. 完成所建工程的验证调试。
二、实验要求
贴片滑动变阻器的动触点通过连接至STM32 芯片的ADC 通道引脚。当我们使用旋转滑动变阻器调节旋钮时,其动触点电压也会随之改变,电压变化范围为0~3.3V,亦是开发板默认的ADC 电压采集范围。
三、实验内容及步骤
1. 软件设计
① 实验新建文件步骤:
运行Keil 5开发环境。编写两个ADC 驱动文件,AD.c 和 AD.h,用来存放ADC 所用IO 引脚的初始化函数以及ADC 配置相关函数。
② 编程要点:
- 初始ADC 用到的GPIO;
- 设置ADC 的工作参数并初始化;
- 设置ADC 工作时钟;
- 设置ADC 转换通道顺序及采样时间;
- 配置使能ADC 转换完成中断,在中断内读取转换完数据;
- 使能ADC;
- 使能软件触发ADC 转换。
ADC 转换结果数据使用中断方式读取,这里没有使用DMA进行数据传输。
2. 实验步骤
(1)运行Keil uVision5开发环境,建立一个项目工程。
(2)在工程中添加main.c文件,因需要用到OLED显示屏,所以将之前实验写好的OLED文件移植到该工程中,然后在main.c中调用,如图1所示。
图1 移植程序
(3)在工程中添加ADC转换相关文件,因此需要创建AD.c文件,初始化ADC通道配置,同时在文件内编写功能函数AD_GetValue(),获取AD转换值,如图2所示。
图2 编写AD.c代码
(4)编写AD.h程序,方便以后工程文件以移植,使项目工程工具有移植性,如图3所示。
图3 AD.h程序
(5)编写main.c程序,调用AD_GetValue()函数获取数据,然后将其转换成实际的电压值,如图4所示。
图4 main.c程序
运行并调试成功并无错误和警告。
3. 调试验证及结果
(1)将开发板连接到电脑上,使用STLINK将程序烧录到STM32中。
(2)当电位器位于中间时,观察当前测得数据,如图5所示:
图5 电位器位于中间
(3)当电位器位于最下方时,观察当前测得数据,如图6所示:
图6 电位器位于最下方
(4)当电位器位于任意位置时,观察当前测得数据,如图7所示:
图7 电位器位于任意位置
四、实验代码分析
(1)ADC初始化程序:
void AD_Init(void){
//开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//选择规则组的输入通道
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);
//初始化ADC
ADC_InitTypeDef ADC_InitTypeDefstructure;
ADC_InitTypeDefstructure.ADC_DataAlign = ADC_DataAlign_Right;//对齐方式
ADC_InitTypeDefstructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//触发源选择
ADC_InitTypeDefstructure.ADC_Mode = ADC_Mode_Independent;//配置ADC工作模式
ADC_InitTypeDefstructure.ADC_ContinuousConvMode = DISABLE;//连续转换
ADC_InitTypeDefstructure.ADC_ScanConvMode = DISABLE;//扫描转换
ADC_InitTypeDefstructure.ADC_NbrOfChannel = 1;//通道数目
ADC_Init(ADC1,&ADC_InitTypeDefstructure);
//开启ADC
ADC_Cmd(ADC1,ENABLE);
//校准ADC
ADC_ResetCalibration(ADC1);//复位校准
while(ADC_GetResetCalibrationStatus(ADC1) == SET);//等待校准完成
ADC_StartCalibration(ADC1);//复位校准
while(ADC_GetCalibrationStatus(ADC1) == SET);
}
(2)ADC功能函数程序:
uint16_t AD_GetValue(void){
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件触发转换
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);//获取标志位状态
return ADC_GetConversionValue(ADC1);//获取转换值
}
(3)main函数程序:
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"
uint16_t value;
float V;
int main(){
OLED_Init();
AD_Init();
OLED_ShowString(1,1,"ADValue:");
OLED_ShowString(2,1,"V:0.00V");
while(1){
value = AD_GetValue();
V = (float)value /4095 * 3.3;
OLED_ShowNum(1,9,value,4);
OLED_ShowNum(2,3,V,1);
OLED_ShowNum(2,5,(uint16_t)(V*100)%100,2);
}
}
五、实验总结
本次实验的目的是学习ADC(模数转换器)的基础功能,并通过KEIL5进行仿真和调试。在实验中,我们使用了贴片滑动变阻器来模拟模拟信号,并通过ADC将其转换为数字信号进行采集和测量。以下是我对本次实验的实验总结和心得体会:
在实验中,我首先通过学习和了解ADC的基本原理和功能,对其工作原理有了清晰的认识。ADC是将连续的模拟信号转换为离散的数字值的设备,它对于嵌入式系统中的模拟信号采集和处理非常重要。通过实验,我学会了如何配置ADC的工作模式、通道和采样率等参数,以及如何读取和处理ADC转换的结果。
在编写程序的过程中,我充分运用了KEIL5的开发环境和工具。通过配置寄存器和调用库函数,我设置了GPIO引脚的功能和ADC的相关参数。同时,我也学会了使用KEIL5的仿真和调试功能,通过设置断点、单步执行和观察变量值等操作,逐步检查程序的运行情况,并找出可能存在的问题和错误。
在实验过程中,我遇到了一些挑战和困难。其中一个挑战是正确连接滑动变阻器的引脚和ADC通道引脚,确保信号能够正确地传输和采集。另外,我还需要注意ADC的采样率和精度,确保采集到的数据准确无误。通过仔细阅读芯片手册和参考资料,并结合实际的电路连接,我成功地克服了这些挑战。
在调试过程中,我发现一些常见的问题和错误。例如,未正确配置ADC通道引脚的功能,或者忘记使能ADC模块等。通过仔细检查代码和参考文档,我能够快速定位并解决这些问题。同时,我也学会了利用串口通信或其他外设来显示和输出ADC采集的数据,以验证程序的正确性和准确性。
通过本次实验,我不仅加深了对ADC的理解和掌握,还提高了我的编程和调试能力。我学会了如何使用嵌入式开发工具和硬件设备进行实验,将理论知识应用到实际的项目中。同时,我也意识到在实际开发中,仔细的电路连接和正确的配置非常重要,这对于确保系统的正常运行至关重要。
总而言之,本次实验让我更深入地了解了ADC的基础功能和应用,提高了我的嵌入式系统开发能力。通过实践和实验,我更加熟悉了开发流程和方法,对于将理论知识应用到实际项目中有了更好的把握。这将对我未来的学习和工作中的嵌入式系统开发起到积极的推动作用。我将继续不断学习和探索,提升自己在嵌入式系统开发领域的能力和水平。文章来源:https://www.toymoban.com/news/detail-557945.html
源码:实验6文章来源地址https://www.toymoban.com/news/detail-557945.html
到了这里,关于实验(六):ADC应用:独立模式单通道采集实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!