STM32ARM综合实验报告南京航空航天大学.docx
- 文档编号:30146197
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:16
- 大小:431.21KB
STM32ARM综合实验报告南京航空航天大学.docx
《STM32ARM综合实验报告南京航空航天大学.docx》由会员分享,可在线阅读,更多相关《STM32ARM综合实验报告南京航空航天大学.docx(16页珍藏版)》请在冰豆网上搜索。
STM32ARM综合实验报告南京航空航天大学
南京航空航天大学
研究生实验报告
项目名称:
ARM嵌入式系统设计与应用技术
设计专题:
综合实验二类:
数据采集和显示系统
班级:
小组成员
(1)姓名:
学号:
学科:
电话:
Email:
导师:
(2)姓名:
学号:
学科:
电话:
Email:
导师:
(3)姓名:
学号:
学科:
电话:
Email:
导师:
20XX年XX月XX日
一、本实验主要内容及要求
本次综合实验的主要内容是,利用ARM内部的A/D转换器进行数据采集和显示系统设计。
实验要求如下:
1、采用STM32开发板上的12位A/D转换器(参考电压3.3V)采集电位器测试点的电压值。
电位器与A/D的输入通道14相连接。
2、当按下Key键之后任意旋转电位器,利用A/D转化器采样20组电压值(每1ms采样一次,使用定时器TIM2计时),并在液晶屏幕上显示当前电压值,当再次按下Key键之后将20组电压值存入到FLASH中。
3、复位后按下Temper键将保存的20组电压值在液晶屏幕中央绘制出波形(要求各点连接,每个点为5个像素,要有坐标系)。
1)横坐标为“1~20”,每个横坐标之间的间隔为8个像素点;
2)纵坐标为电压值“0V,1V,2V,3V,4V”,相邻坐标之间的为10个像素点。
4、在液晶屏合适的位置显示组名、姓名、学号、开发日期等信息。
可利用STM32开发板的资源扩展其他自定义功能(如增加温度采集通道、当前采样频率显示和设置、采样率调节等)。
二、硬件框图
本次实验的硬件部分主要是计算机和STM32两个部分,对于计算机部分不做过多的介绍,下面着重介绍STM32中的与本实验相关模块。
1.1ADC模块
12位ADC是一种逐次逼近型模拟数字转换器。
它有多达18个通道,可测量16个外部和2个内部信号源。
各通道的A/D转换可以单次、连续、扫描或间断模式执行。
ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。
ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。
STM32教学平台的电位器是信号是连接到STM32的PC4口的,PC4正好是A/D转换的通道14,STM32实验教学平台上也标注了ADC12_14(14通道),电位器硬件框图如图1所示,ADC硬件框图如图1所示。
图1ADC硬件框图
1.2Flash存储模块
STM32F103ZET6有3个SPI,分别为SPI1、SPI2和SPI3。
其中SP2和I2S2,SPI3和I2S3共用管脚,采用SPI功能还是I2S功能是由SPI_I2S_CFGR寄存器的第11位I2SMOD来决定的。
SPI_I2S配置寄存器(SPI_I2S_CFGR)昨天 00:
52上传,如下图3所示。
其中I2SMODE位为1时表示选择I2S模式,为0时表示选择SPI模式。
在STM32开发板上,是采用STM32的SPI1连接SPIFLASH的,如图2所示,STM32与M25P80的IO接口对应关系如表1所示。
图2STM32的SPI1硬件框图
前天 19:
47上传下载附件(28.5KB)表1STM32与M25P80的IO接口对应关系
STM32接口名称
M25P80接口名称
PB2(CS)
S(片选信号)
PA5(SPI1_SCK)
C(串行时钟)
PA6(SPI1_MISO)
Q(串行数据输出)
PA7(SPI1_MOSI)
D(串行数据输入)
1.3Key按键介绍
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
消抖是为了避免在按键按下或是抬起时电平剧烈抖动带来的影响。
按键的消抖,可用硬件或软件两种方法。
Key硬件框图如图3所示,按键输入与PG8口连接。
当按键不按下时,PG8口输入高电平;当按键按下时,PG8口输入低电平。
图3Key硬件框图
1.4定时器
STM32有4个定时器单元,一共有8个定时器。
定时器1和定时器8构成功能强大的高级定时器,这两个定时器在电机控制方面有绝对的优势。
其他剩下的定时器是通用定时器。
STM32的定时器除了可以计时外,还可以捕获比较。
这些定时器具有捕获比较功能,同时还有一些特殊的工作模式。
如在捕获模式下,定时器将启用一个输入过滤器和一个特殊的PWM测量模块,同时还支持编码器输入,这些编码输入可以测出电机的旋转方向甚至可以测出速度。
而在比较模式下,定时器可以实现标准的比较功能、输可以调节占空比的PWM波。
STM32定时器内部结构,如图4所示。
图4STM32定时器内部结构
三、程序流程图
1、主程序流程图
图5主程序的流程框图
如图5所示,对于该流程框图的分析如下:
1)对STM32的初始化,其中包括ADC初始化、SPI串口初始化、LCD初始化等,初始化过程在其相应的子程序中执行。
2)显示组员的信息和时间,正如实验七所学的,运用函数LCD_ShowString(),即可在LCD上显示自己所需要的信息,其显示的位置可以根据设定的坐标来设置。
3)设置Key键,当Key键被按下时,开始采集数据并将其显示,而数据采集和显示的编程及其分析过程在前面的实验七中已经有过比较详细的介绍了,所以这里不再赘述。
同时,采集到的数据及时的将其存储在Flash中,Flash的设置在其初始化中已经完成。
4)设置Temper键,当Temper键被按下的时候,开始对之前采集到的数据进行绘图,而绘图的过程在之后的子程序中有比较详尽地介绍,这里也不在作详细的说明。
2、子程序流程图
对于采集20组数据并显示、20组数据绘图两个子程序进行详细地说明如下:
1)采集20组数据并显示子程序。
ADC数据采集的编程在之前的实验中已经介绍过,STM32芯片的ADC转换模块是12位的逐次逼近,所以在采集到14通道的数据除以4096(212),同时应当熟悉ADC转换的初始化过程,在采集一个数据之后,将其保存在flash中,同时经过一定的延时之后进行下一个数据采集,直到采集满20个数据为止,流程图如图6所示。
图6采集数据并显示子程序流程图
2)将20组数据绘图。
在采集完20组数据后,进入绘图子程序,绘图最初是进行坐标的建立,坐标轴绘制好之后,依次读取存入Flash中的数据,并通过计算将其转换成坐标系中相应的坐标值,并通过函数LCD_DrawLine(X1,Y1,X2,Y2)将其显示出来,直到绘制完20个数据为止,流程图如图7所示。
图7数据绘制子程序
四、实验结果和分析
1、软件的调试结果
将程序烧录到STM32中进行调试,调试结果如图8~9所示,从图中可知,程序满足实验要求。
图8显示日期及组员信息
图9显示电压值及数据绘图
2、结果分析
如调试结果可知,程序基本上满足了本实验的要求,其中,20个数据的值是通过拧动电位器上的旋转键而得到的,在采样周期和操作人员拧动速度合适的情况下,数据所绘的图有一定的连续性。
如果设置的采样周期太短的话,绘制的图就可能是一条直线,采集的数据是相同的值,所以在编程的时候,尽量把采样时间设置的合理一点。
在编写显示组员信息的程序时,重要的是把坐标点设置合理,不然的话会出现显示的字母重叠现象,或是离的比较远,上面的调试结果图是经过组员对程序的坐标的调整,而得到的比较合适的位置。
五、源程序清单
#include"include.h"
#defineKEY_ON0
#defineKEY_OFF1
floatset_value[1];
floatGet_adcvalue[1];
floatADC_Flash[20];
voidDraw_BigPoint(u16x,u16y)
{
LCD_DrawPoint(x,y);
LCD_DrawPoint(x-1,y);
LCD_DrawPoint(x+1,y);
LCD_DrawPoint(x,y-1);
LCD_DrawPoint(x,y+1);
}
intmain(void)
{
inti;
intsectorCnt;
u32Flash_ID;
charj=0;
charflag=0;
u16X1,Y1,X2,Y2;
floatAdc_Value,lastvalue,adctemp;
floatadcgroup[20];
u32ADC_ConvertedValue;
charfilename[260];
delay_init();
uart_init(9600);
NVIC_Configuration();
Key_GPIO_Config();
Adc_Init();
LCD_Init();
SPI_FLASH_Init();
//TIM2_Int_Init(9999,71999);
LED_GPIO_Config();
Flash_ID=SPI_FLASH_ReadID();
POINT_COLOR=BLACK;
LCD_ShowString(40,5,"The11thGroup,2014.5.28");
LCD_ShowString(30,30,"ChenMaowuSX1403012");
LCD_ShowString(30,50,"ZengRuipengSX1403006");
LCD_ShowString(30,70,"GeZhishangSX1405117");
while
(1)
{
if(Key_Scan(GPIOG,GPIO_Pin_8)==KEY_ON)
{
LCD_Clear(WHITE);
POINT_COLOR=GREEN;
LCD_DrawLine(60,200,240,200);
LCD_ShowString(40,195,"0V");
LCD_DrawLine(60,200,60,110);
LCD_DrawLine(58,180,62,180);
LCD_ShowString(40,175,"1V");
LCD_DrawLine(58,160,62,160);
LCD_ShowString(40,155,"2V");
LCD_DrawLine(58,140,62,140);
LCD_ShowString(40,135,"3V");
LCD_DrawLine(58,120,62,120);
LCD_ShowString(40,115,"4V");
LCD_ShowString(36,100,"Voltage");
LCD_DrawLine(100,198,100,202);
LCD_ShowString(96,205,"5");
LCD_DrawLine(140,198,140,202);
LCD_ShowString(136,205,"10");
LCD_DrawLine(180,198,180,202);
LCD_ShowString(176,205,"15");
LCD_DrawLine(220,198,220,202);
LCD_ShowString(216,205,"20");
if(flag==0)
{
for(j=0;j<20;j++)
{
ADC_ConvertedValue=Get_Adc(ADC_Channel_14);
Adc_Value=(float)ADC_ConvertedValue/4096*3.3;
adcgroup[j]=Adc_Value;
sprintf(filename,"CurrentValue:
%.3f",adcgroup[j]);
LCD_ShowString(30,60,filename);
POINT_COLOR=BLUE;
X1=68+8*j;
Y1=200-20*Adc_Value;
Draw_BigPoint(X1,Y1);
delay_ms(1000);
}
}
if(flag==1)
{
sectorCnt=sizeof(adcgroup)/SPI_FLASH_SectorSize;
if(sizeof(adcgroup)%SPI_FLASH_SectorSize!
=0)
sectorCnt++;
for(i=0;i { SPI_FLASH_SectorErase(i*SPI_FLASH_SectorSize); } for(j=0;j<20;j++) { set_value[0]=adcgroup[j]; SPI_FLASH_BufferWrite((u8*)set_value,4*j,sizeof(float)); } LCD_Clear(WHITE); POINT_COLOR=RED; LCD_ShowString(60,120,"HaveStoredInFlash! "); } flag=! flag; } if(Key_Scan(GPIOC,GPIO_Pin_13)==KEY_ON) { for(j=0;j<20;j++) { SPI_FLASH_BufferRead((u8*)Get_adcvalue,4*j,4); ADC_Flash[j]=Get_adcvalue[0]; } POINT_COLOR=GREEN; LCD_DrawLine(60,200,240,200); LCD_ShowString(40,195,"0V"); LCD_DrawLine(60,200,60,110); LCD_DrawLine(58,180,62,180); LCD_ShowString(40,175,"1V"); LCD_DrawLine(58,160,62,160); LCD_ShowString(40,155,"2V"); LCD_DrawLine(58,140,62,140); LCD_ShowString(40,135,"3V"); LCD_DrawLine(58,120,62,120); LCD_ShowString(40,115,"4V"); LCD_ShowString(36,100,"Voltage"); LCD_DrawLine(100,198,100,202); LCD_ShowString(96,205,"5"); LCD_DrawLine(140,198,140,202); LCD_ShowString(136,205,"10"); LCD_DrawLine(180,198,180,202); LCD_ShowString(176,205,"15"); LCD_DrawLine(220,198,220,202); LCD_ShowString(216,205,"20"); for(i=0;i<20;i++) { POINT_COLOR=BLUE; X1=68+8*i; Y1=200-20*ADC_Flash[i]; Draw_BigPoint(X1,Y1); if(i<19) { X2=X1+8; Y2=200-20*ADC_Flash[i+1]; POINT_COLOR=RED; LCD_DrawLine(X1,Y1,X2,Y2); } } } } } 六、实验分工 实验中,三人为一组,组员之间相互合作、共同进步。 对于实验的内容,组员之间一起讨论、编程,分工不会很明确,只要有哪个组员有合理的想法,就可以将自己的想法编入程序中,实验报告和专题报告是独自完成,而这综合实验报告是组员一起完成的,分工是次要的,合作才是重点。 七、对本实验课程的几点建议 本课程意义重大,老师上课讲课认真,同学对实验专注、热忱。 但是这有一个小小的建议,可能有些同学在上这门课程之前,对STM32一点了解也没有,所以在实验刚开始的时候,可以把理论知识多加一点,讲解的更细致一些,这样的话,这门课程就很完美了! 最后,再次感谢老师的谆谆教诲! !
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32ARM 综合 实验 报告 南京航空航天 大学
![提示](https://static.bdocx.com/images/bang_tan.gif)