基于STM32的数字电压表的设计_第1页
基于STM32的数字电压表的设计_第2页
基于STM32的数字电压表的设计_第3页
基于STM32的数字电压表的设计_第4页
基于STM32的数字电压表的设计_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、华南理工大学广州学院 题目: 基于stm32的数字电压表的设计姓 名: 学 号: 系 别: 班 级: 指导老师: 完成时间: 1、 设计目的 1. 培养综合运用所学知识、独立分析和解决实际问题的能力,培养创新意识和创新能力,并获得科学研究的基础训练。2. 掌握ad转换的基础知识,学习基于dma专递方式的adc采集软件的编制及控制流程。3. 通过软硬件设计实现数字电压表的功能。2、 设计内容1、将一模拟电压信号输入到a/d转换器的任一通道。2、a/d转换器将输入的模拟电压值转换成数字量。3、根据学习开发板所用a/d转换器的类型,将转换成的数字量通过一定的算法转换成相应的电压值。4、将转换成电压值

2、通过学习开发板上的lcd显示屏进行显示,要求显示一位小数。3、 设计原理1、a/d变换原理 采样: 间隔一定时间对信号进行采样,用信号序列来代替原来时间上连续的信号。均匀采样:可完整地恢复原始信号,其中,t为采样时间间隔,fs表示采样频率,fm表示原始信号最大频率。 量化: 把采集到的数值送到量化器编码成数字形式,每个样值代表一次采样所获得的信号的瞬时幅度。 a/d转换器一般为标量均匀量化。(量化还可分为:标量量化、矢量量化) 量化误差(与舍入方式相关):1lsb或 1/2lsb 编码: a/d模拟/数字转换器一般采用二进制编码,a/d变换后的结果到此可以表示为一个以0、1二进制形式表示的比特

3、流,单位时间内可以传输的二进制比特速率就是a/d之后的码速率,数值上等于采样频率与量化比特数值之乘积。 二进制编码:量化与字长的关系。3、adc的a/d转换方式在查询方式下,软件可通过读取adc模块转换完毕引脚eoc的状态或状态寄存器中的转换完成标志位判断本次a/d是否结束; 若结束则从数据总线或数据寄存器中读取a/d结果数据。2、adc模拟/数字转换器: stm32的adc是12位逐次逼近型的模拟数字转换器。它有18个通道可测量16个外部和2个内部信号源。各通道的a/d转换可以单次、连续、扫描或间断模式执行。adc的结果可以左对齐或右对齐方式存储在16位数据寄存器中。3、转换特点: stm3

4、2的adc最大的转换速率为1mhz,也就是转换时间为1us(adcclk=14m,采样周期为1.5个adc时钟下得到),不能让adc的时钟超过14m,否则将导致结果准确度下降。 4、stm32将adc的转换分为2个通道组: 规则通道组和注入通道组。规则通道相当于运行的程序,而注入通道就相当于中断。在程序正常执行的时候,中断是可以打断程序正常执行的。同这个类似,注入通道的转换可以打断规则通道的转换,在注入通道被转换完成之后,规则通道才得以继续转换。规则组设置后,可以按照设置的通道顺序对各通道进行依次采集。方便于对多路adc通道的自动采集。注入组最多设置4个通道,简单来讲就是需要触发才能采集设置的

5、通道adc值。 本设计选择了采用规则组,设置了一个通道进行自动采集。5、此设计显示电压的特点:本设计测量电压值范围为0-3.3v的电压,显示误差为0.001v。lcd实时显示电压值,microsd卡对数据进行同步存储。系统原理框图如图1所示。6、dma请求: 在这次设计中用到了adc转换结果采用dma传递方式。直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须cpu任何干预,通过dma数据可以快速地移动。这就节省了cpu的资源来做其他操作。7、lcd控制电路(1)本设计所使用的lcd为3寸,400x240分辨率。lcd模块使用stm32的fsmc接口控制。3tf

6、t显示屏焊接在奋斗显示转接板上,在屏上贴有触摸屏,通过40芯的接口与v3或者mini连接。40芯接口定义如下: 对要显示在lcd上的数据进行写入寄存器,其时序图如下: 图(a) 写入寄存器时序图 对要显示在lcd上的数据进行读取,其时序图如下: 图(a) 读出寄存器时序图(2)fsmc(flexible static memory controller)即可变静态存储控制器,是stm32系列中内部集成256kb以上flash,后缀为xc、xd和xe的高存储密度微控制器特有的存储控制机制。通过对特殊功能寄存器的设置,fsmc能够根据不同的外部存储器类型,发出相应的数据/地址/控制信号类型以匹配信

7、号的速度,从而使得stm32系列微控制器不仅能够应用各种不同类型、不同速度的外部静态存储器,在stm32内部,fsmc的一端通过内部高速总线ahb连接到内核cortex-m3,另一端则是面向扩展存储器的外部总线。内核对外部存储器的访问信号发送到ahb总线后,经过fsmc转换为符合外部存储器通信规约的信号,送到外部存储器的相应引脚,实现内核与外部存储器之间的数据交互。f s m c起到桥梁作用,既能够进行信号类型的转换,又能够进行信号宽度和时序的调整,屏蔽掉不同存储类型的差异,使之对内核而言没有区别。fsmc可以连接nor/psram/nand/pc卡等设备,并且拥有fsmc_a25:0共26条

8、地址总线,fsmc15:0共16条数据总线。另外,fsmc扩展的存储空间被分成8个块。通过地址线选择操作的块。这样,lcd将被看作一个拥有一块地址空间的存储器进行操作。 从fsmc的角度看,可以把外部存储器划分为固定大小为256m字节的四个存储块。 存储块1用于访问最多4个nor闪存或psram存储设备。这个存储区被划分为4个nor/psram区并有4个专用的片选。 存储块2和3用于访问nand闪存设备,每个存储块连接一个nand闪存。 存储块4用于访问pc卡设备,每一个存储块上的存储器类型是由用户在配置寄存器中定义的。4、 设计程序(命令)清单以及程序流程图1、主程序:int main(vo

9、id) u16 len, c2len,c3len,c4len;u8 c = voltage ;u8 c2 = ;u8 c3 = ;u8 c4 = . v ;u16 bkcolor; len = sizeof(c)-1; /计算字节数长度sizeof()c2len = sizeof(c2)-1;c3len = sizeof(c3)-1;c4len = sizeof(c2)-1;bkcolor = white; rcc_configuration(); /系统时钟配置为72mhz usart1_init(); /串口1初始化 adc_configuration(); /adc初始化 fsmc_lc

10、d_init(); /fsmc总线配置 lcd_init(); /液晶初始化 / lcd_putchar(10,10,g,0x0000,0xffff); / lcd_test(); usart_out(usart1,rn usart1 print ad_value - rn); while (1) if (ticks+ = 900000) /间隔时间显示转换结果 ticks = 0; clock1s = 1; if (clock1s) clock1s = 0; usart_out(usart1,the current ad value = %d rn, adc_convertedvalue);

11、 /串口显示字符段 /delay(0xafffff); precent = (adc_convertedvalue*100/4096);/ 算出百分比,2的12次幂为0xfff voltage = precent*33; / voltage为实际电压值的1000倍. c43=(voltage/1000+0) ;/ 取千位数的整数部分 c45=(voltage%1000)/100+0) ; /对千位数取余数后再取其百位的整数部分 c46=(voltage%100)/10)+0) ;/对百位数取余数后再取其十位的整数部分 c47=(voltage%10)+0) ;/对百位数取余数后再取其个位的整数

12、部分lcd_putstr_16x24_center(0, c3, c4len,black, bkcolor);lcd_putstr_16x24_center(line1, c, len,black, bkcolor); lcd_putstr_16x24_center(line2, c3, c3len,black, bkcolor); lcd_putstr_16x24_center(line3, c4, c4len,black, bkcolor); lcd_putstr_16x24_center(line4, c2, c2len,black,bkcolor);usart_out(usart1,t

13、he v value = %d.%d%d%d vrn, c43=(voltage/1000),c45=(voltage%1000)/100),c46=(voltage%100)/10,c47=(voltage%10);/显示实际电压值 lcd_test(); 2、adc配置: adc_configuration函数用于配置adc1的通道11,因为只用了adc1所以采用了adc独立模式,设置通道11进入规则组,规则组里的通道只有1个,就是通道1,转换用了扫描方式,软件触发,转换结果采用dma方式传递到2字节长度的缓存区里(adc_convertedvalue),默认的adcclk为36mhz,采

14、样周期是55.5+12.5时钟周期,相当于采样时间是间隔(68/36)us。void adc_configuration(void)adc_inittypedef adc_initstructure;gpio_inittypedef gpio_initstructure;dma_inittypedef dma_initstructure; /设置ad模拟输入端口为输入 1路ad 规则通道 gpio_initstructure.gpio_pin = gpio_pin_1; gpio_initstructure.gpio_mode = gpio_mode_ain; gpio_init(gpioc,

15、 &gpio_initstructure);/* enable dma clock */ rcc_ahbperiphclockcmd(rcc_ahbperiph_dma1, enable); /* enable adc1 and gpioc clock */ rcc_apb2periphclockcmd(rcc_apb2periph_adc1 , enable); /* dma channel1 configuration -*/使能dmadma_deinit(dma1_channel1);dma_initstructure.dma_peripheralbaseaddr = adc1_dr_a

16、ddress; /dma通道1的地址 dma_initstructure.dma_memorybaseaddr = (u32)&adc_convertedvalue; /dma传送地址dma_initstructure.dma_dir = dma_dir_peripheralsrc; /传送方向dma_initstructure.dma_buffersize = 1; /传送内存大小,100个16位dma_initstructure.dma_peripheralinc = dma_peripheralinc_disable; dma_initstructure.dma_memoryinc =

17、dma_memoryinc_enable; /传送内存地址递增dma_initstructure.dma_peripheraldatasize = dma_peripheraldatasize_halfword;/adc1转换的数据是16位dma_initstructure.dma_memorydatasize = dma_memorydatasize_halfword;/传送的目的地址是16位宽度dma_initstructure.dma_mode = dma_mode_circular;/循环dma_initstructure.dma_priority = dma_priority_hig

18、h;dma_initstructure.dma_m2m = dma_m2m_disable;dma_init(dma1_channel1, &dma_initstructure); /* 允许dma1通道1传输结束中断 */dma_itconfig(dma1_channel1,dma_it_tc, enable);/使能dma通道1dma_cmd(dma1_channel1, enable); /adc配置adc_initstructure.adc_mode = adc_mode_independent;/adc1工作在独立模式adc_initstructure.adc_scanconvmod

19、e = enable;/模数转换工作在扫描模式(多通道)还是单次(单通道)模式adc_initstructure.adc_continuousconvmode = enable;/模数转换工作在扫描模式(多通道)还是单次(单通道)模式adc_initstructure.adc_externaltrigconv = adc_externaltrigconv_none;/转换由软件而不是外部触发启动adc_initstructure.adc_dataalign = adc_dataalign_right;/adc数据右对齐adc_initstructure.adc_nbrofchannel = 1

20、; /规定了顺序进行规则转换的adc通道的数目。这个数目的取值范围是1到16adc_init(adc1, &adc_initstructure);/* adc1 regular channels configuration 规则模式通道配置*/ /adc1 规则通道配置 adc_regularchannelconfig(adc1, adc_channel_11, 1, adc_sampletime_55cycles5); /通道11采样时间 55.5周期/使能adc1 dma adc_dmacmd(adc1, enable);/使能adc1adc_cmd(adc1, enable);/ 初始化

21、adc1校准寄存器adc_resetcalibration(adc1);/检测adc1校准寄存器初始化是否完成while(adc_getresetcalibrationstatus(adc1);/开始校准adc1adc_startcalibration(adc1);/检测是否完成校准while(adc_getcalibrationstatus(adc1);/adc1转换启动adc_softwarestartconvcmd(adc1, enable); 3、 程序流程图:startadc、串口、液晶初始化启动a/d转换读取adc状态a/d转换结束?读取a/d转换结束处理a/d转换启动串口写入寄存

22、fsmc串口数据传输启动lcd电压值显示读出寄存器fsmc,lcd显示结束5、 运行步骤、结果,保存截屏,实物图1、运行步骤、结果:步骤: (1)对程序编译并且下载到stm32开发板; (2)按下复位键,记录所测到的内部电压值u内部; (3)用跳线把外部20个gpio电压源端口分别接入到canera的14口,从而测量外部电压u外部gpio1u外部gpio20 (4)在每次接入一个外部gpio电压源时,都复位一次并且记录所测到电压值u外部gpio1u外部gpio20。结果: (1)内部电压值: u内部 = 1.683v (2)外部端口电压值:外部端口u外部gpio1u外部gpio2u外部gpio

23、3u外部gpio4u外部gpio5电压值3.267v0.000v3.267v3.267v3.267v外部端口u外部gpio6u外部gpio7u外部gpio8u外部gpio9u外部gpio10电压值3.267v3.267v1.617v 1.650v0.429v外部端口u外部gpio11u外部gpio12u外部gpio13u外部gpio14u外部gpio15电压值1.650v1.650v2.409v3.267v0.000v外部端口u外部gpio16u外部gpio17u外部gpio18u外部gpio19u外部gpio20电压值1.617v 1.617v 1.617v 3.267v0.000v2、保存截屏: 测试到的个别电压值在串行助手显示结果如下: (1)内部电压值:(2)外部端口1电压值:(3)外部端口8电压值:(4)外部端口10电压值:(5)外部端口13电压值:3、实物图:上图显示结果如下图:六、设计的收获与体会 今个学期刚刚接触到stm32,经过黄金杨老师的介绍,我真正的体会到了stm32的强大之处,stm32采用contex-m3内核,是32位的,比起8位的51单片机好多了,并且其处理数据速度非常快, flash,ram 也是很大的,还有16 位的fsmc 总线等等的强项,这是51单片机望而不及的。 老师刚刚定好课程设计的题目的时候,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论