《AD,转换器实验.doc》由会员分享,可在线阅读,更多相关《AD,转换器实验.doc(4页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、齐 鲁 理 工 学 院 实 验 报 告 课程名称:微型计算机控制技术2020.11.05 地点:D203 班级:2017 级机制 3 班 姓名:杨帆 学号:171031010304 实验项目名称:A/D 转换器实验 实验指导教师:赵保华 实验成绩评定:一、 实验目的 通过实验掌握 STM32 A/D 转换器的功能与作用。掌握 STM32A/D 转换器的配置与使用。二、 实验设备 硬件:信盈达 STM32 实验平台,STlink 仿真器套件,PC机,串口连接线;软件:KEIL for ARM(MDK)集成开发环境,串口调试助手,Windows7/8/10/XP。三、 实验内容 利用 ADC 的第
2、 1 通道对信盈达 Cotex-M3 实验平台上单圈电位器的电压值作 AD 转换,采用连续转换模式。ADC 转换的结果,通过串口发送到 PC 显示。四、 实验原理 五、 软件程序设计 1、程序完成以下工作:移植:1)移植内核定时器实现精确延时。sys_tick.c sys_tick.h 配置 ADC 配置GPIO 口,将 PA1 配置为 ADC 的第 1 采样通道;设置 ADC,将 ADC_IN1 设置为连续转换模式;配置串口及相关发送功能;利用串口发送 AD 转换结果。3. 观察实验结果 将 VER+和 VDDS,VERF和 GND 用跳线帽连起来,旋转电位器,即 AD 输入旋钮,可以看到串
3、口输出数值不断变化, 3.6.7 实验参考程序main.c 参考程序:#include “stm32f10 x.h“ #include “stdio.h“ #include“uart.h“ #include “adc.h“ #include “sys_tick.h“ #include“NVIC.h“ int main(void) NVIC_Config(); /NVIC 中断管理初始化SysTickConfig(); /滴答时钟初始化,实现精确延时 UART1_Init(); /串口1 初始化 Adc_Init(); /ADC 初始化 while(1) Adc_test(); /ADC 测试函
4、数,打印滑动变阻器的电压值 Delay_ms(2000);/精确延时 2000ms adc.c参考程序:#include “stm32f10 x.h“ #include “adc.h“ #include“sys_tick.h“ #include “stdio.h“ /adc 的初始化 void Adc_Init(void) GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDefADC_InitStructure; /开启 GPIO 口和 ADC 的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RC
5、C_APB2Periph_ADC1,ENABLE); /给 ADC 采样分频 72/8 = 9RCC_ADCCLKConfig(RCC_PCLK2_Div8); /设置 ADC 输入管脚 PA1GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;/模拟输入引脚GPIO_Init(GPIOA,&GPIO_InitStructure); ADC_InitStructure.ADC_Mode =ADC_Mode_Independent;/ADC 独立模式ADC_InitStruct
6、ure.ADC_ContinuousConvMode = DISABLE;/单次循环模式还是连续循环模式 DISABLE 单次循环 ADC_InitStructure.ADC_ScanConvMode =DISABLE; /多通道还是单通道 DISABLE 单通道ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;/有事件触发还是软件触发 ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right;/数据右对齐 - 低 12 位ADC_InitStructure.AD
7、C_NbrOfChannel = 1;/顺序转换的规则组的通道数目ADC_Init(ADC1,&ADC_InitStructure); /给相关寄存器赋值ADC_Cmd(ADC1,ENABLE); /开启 ADC1 ADC_ResetCalibration(ADC1); /使用复位校准,就是初始化校准寄存器while(ADC_GetResetCalibrationStatus(ADC1) = SET);ADC_StartCalibration(ADC1); /A/D 校准while(ADC_GetCalibrationStatus(ADC1) = SET); /得到 ADC 值 voidGet
8、_adcvalue(u8 channel,u16 *value) /设置指定 ADC 的规则组通道,一个序列,采样时间ADC_RegularChannelConfig(ADC1,channel,1,ADC_SampleTime_239Cycles5);/软件启动 ADC 转换 ADC_SoftwareStartConvCmd(ADC1,ENABLE); /等待 ADC转换完成 while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) != SET); *value =ADC_GetConversionValue(ADC1); /* 测试读取外部滑动变阻器的电压值 *
9、/void Adc_test(void) u16 temp = 0; float ad_value;Get_adcvalue(1,&temp);/获取通道 1 的值 / printf(“%#xrn“,temp);ad_value = (3.3*(float)temp)/4096.0;/转换得到实际的电压值printf(“%frn“,ad_value); Delay_ms(500); adc.h 参考程序:#ifndef _ADC_H_ #define _ADC_H_ #include “stm32f10 x.h“ voidAdc_Init(void); void Get_adcvalue(u8
10、 channel,u16 *value); voidAdc_test(void); #endif sys_tick.c 参考程序 #include“stm32f10 x.h“ /#include “core_cm3.h“ /#include“stdio.h“ /#include “stdlib.h“ /#include “uart.h“ /#include“adc.h“ #include “sys_tick.h“ /#include “NVIC.h“ /* static_INLINE uint32_t SysTick_Config(uint32_t ticks); /用来装载定时的时间值 vo
11、id SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource); /用来设置滴答时钟的时钟频率 目的:用滴答时钟形成一个 1us 的定时器;1us = T*(1/f);T:要装载的数;f:滴答时钟运行的时钟频率;1s = 1000ms; 1ms = 1000us; 1s = 1000000us; 1M = 1000000; 1/1M = 1us;t= 1/72M = 1/72us 1us = 72 * t; SystemCoreClock/1000000 - 1usSystemCoreClock/100000 - 10us SystemCoreCl
12、ock/10000 - 100usSystemCoreClock/1000 - 1ms SysTick-CTRL |=SysTick_CTRL_ENABLE_Msk;/打开滴答时钟 SysTick-CTRL &=SysTick_CTRL_ENABLE_Msk;/关闭滴答时钟 */* 函数名:SysTickConfig 形参:无 返回值:无 函数功能:滴答时钟初始化*/ voidSysTickConfig(void) /配置为 72Mhz 时钟 /t= 1/72M = 1/72us; /SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);if(SysT
13、ick_Config(SystemCoreClock/1000000) = 1)/赋初值 /72while(1); /关闭滴答时钟 SysTick-CTRL &= SysTick_CTRL_ENABLE_Msk;/SysTick-CTRL &= 0 x01;/ 0 xfe 1111 1110 /SysTick-CTRL |= 0 x01;/给某些位写 0,用按位与(&)/给某些位写 1,用按位或(|) /* 函数名:Delay_us 形参:time 代表要延时的时间(单位 us)返回值:无 函数功能:精确 us 延时函数*/ u32 TimeDelay =0; void Delay_us(u3
14、2 time) TimeDelay = time; SysTick-CTRL |=SysTick_CTRL_ENABLE_Msk; while(TimeDelay !=0); SysTick-CTRL &=SysTick_CTRL_ENABLE_Msk; /* 函数名:Delay_ms 形参:time 代表要延时的时间(单位 ms)返回值:无 函数功能:精确 ms 延时函数*/ voidDelay_ms(u32 time) TimeDelay = time*1000; SysTick-CTRL |=SysTick_CTRL_ENABLE_Msk; while(TimeDelay !=0); S
15、ysTick-CTRL &=SysTick_CTRL_ENABLE_Msk; /* 函数名:SysTick_Handler 形参:无 返回值:无 函数功能:滴答时钟中断服务函数*/ voidSysTick_Handler(void) if(TimeDelay 0) TimeDelay-; sys_tick.h参考程序 #ifndef _SYS_TICK_H_ #define _SYS_TICK_H_ /#include“includes.h“ #include “stm32f10 x.h“ void SysTickConfig(void);void Delay_us(u32 time); vo
16、id Delay_ms(u32 time); #endif Uart.h 参考程序 #ifndef _UART_H_ #define _UART_H_ void UART1_Init(void);/串口 1初始化 void USART1_Echo(void);/串口 1 回显函数 void Show_Logo(void);/在终端上显示 LOGO #endif NVIC.c #include “NVIC.h“ #include“stm32f10 x.h“ /#include“core_cm3.h“ /*函数名:NVIC_Config 形参:无 返回值:无 函数功能:响应中断和抢占中断的分组 *
17、/ voidNVIC_Config(void)/响应中断和抢占中断的分组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC.h #ifndef_NVIC_H_ #define _NVIC_H_ void NVIC_Config(void);/响应中断和抢占中断的分组 #endif 六、 实验操作步骤 实验操作步骤 准备实验环境 使用 STlink仿真器连接 信盈达 STM32 实验平台的主板 JTAG 接口;使用 实验平台附带的 USB 数据线,连接实验平台主板和 PC。新建工程,编写程序,完成软件设计 新建工程保存文件夹,复制相应的库文件;在开发环境中新建工程,配置工程选项;新建程序代码文件,添加到工程,完成程序编码,无误后将程序下载到开发板的 Flash 中,按 RESET 键复位;添加前面实验程序中的 uart.h uart.c nvic.h nvic.c 在 PC 机上运行串口调试助手(波特率 115200、1 位停止位、无校验位、无硬件流控制),观察实验现象。注意选择上 Use Microlib。七、 实验结果:八、 心得体会 通过本次实验,我学到了很多知识,学习了通过实验掌握STM32 A/D 转换器的功能与作用,掌握 STM32A/D 转换器的配置与使用,感谢老师的指导和同学的帮助
限制150内