优秀作品.docx
《优秀作品.docx》由会员分享,可在线阅读,更多相关《优秀作品.docx(10页珍藏版)》请在冰点文库上搜索。
优秀作品
华为杯电子设计大赛
组员:
叶爽、陆恺立
组号:
38
参赛题目:
一摘要.............................................................................................................3
二各模块原理.................................................................................................3
2.1测温电路部分............................................................................................3
2.1.1频率产生电路.................................................................................3
2.1.2LM75A寄存器读写模块..............................................................4
2.1.3除法电路..........................................................................................6
2.1.4动态显示..........................................................................................7
2.1.5报警电路..........................................................................................8
2.2直流电机控制............................................................................................8
2.2.1PWM输出控制器..........................................................................8
2.2.2脉冲消抖电路和频率计................................................................8
2.2.3占空比控制器.................................................................................9
2.2.4转速显示..........................................................................................10
2.3串口通信部分...........................................................................................10
2.3.1串口部分............................................................................................10
2.3.2串口译码及显示切换....................................................................11
三实验总结.....................................................................................................12
一摘要
本程序能够完成的功能是,自动或手动测温,读取配置寄存器,温度下限寄存器,温度上限寄存器,设定温度上限及下限,当温度到达预定的温度的时候报警。
所有的读取操作都可以在数码管上显示。
其中,温度的上限通过计算机用串口通信协议传输给FPGA内部寄存器然后按动开关写入。
同时,本程序还驱动了一个直流电机,温度高的时候电机转速高,温度低的时候转速降低直至停转。
数码管可以实时显示电机转速,2秒刷新一次。
数码管的显示可以在显示的温度、寄存器值和直流电机转速间切换,切换通过串口进行,计算机发00H时切换到温度及寄存器值显示,发FFH时切换到转速显示。
二各模块原理
下面分模块讲述各部分的原理
2.1测温电路部分
2.1.1频率产生电路
实验箱上时钟为48MHz,首先通过QUARTUS内部可定制的锁相环模块将频率调整为20M,再通过计数器分频。
计数器分频的原理是:
计到预定的分频系数的时候,输出状态反转,计数器清零。
这样就实现了一个输出占空比为50%的时钟的功能。
通过更改分频系数,本模块产生了0.5hz,1k,2k,19.2k,100hz这几个频率。
每个频率都有各自的用途,在后面的相应模块电路内会详细介绍。
图1:
频率产生电路
2.1.2LM75A寄存器读写模块(核心模块)
这部分电路是本程序的核心,它负责控制和LM75A的通信时序。
LM75A是一个使用IIC总线的器件,IIC总线属于同步通信,需要有一个时钟线,一根双向数据线。
时钟线和数据线的常态都为高,通信的时钟线上有时钟,数据线上传输数据。
该模块如图2所示。
输入引脚SDAIN为时序中需要释放总线的时候由三态门读入的总线状态的输入。
RST为复位引脚,低电平有效。
CLK2X,CLK1X分别为两倍和一倍时钟。
MS_WRITE接在串口模块的输出寄存器上,当按下按键时将此寄存器的内容写入TSO/THYST寄存器的高八位。
KEYIN是按键开关。
SDAOUT接在三态门的输入上,根据TRI信号控制通断。
SCL为时钟线。
TRI为三态门控制。
POINT_OUT是指针,指示当前读写模块在读写哪个寄存器。
这个信号要接在后级的显示电路上。
Temp为输出寄存器,即在读完寄存器以后根据指针的值自动生成的。
比如现在读TEMP寄存器,那么TEMPERATURE<=MSBUF(7DOWNTO0)&LSBUF(7DOWNTO5).msbuf和lsbuf就是从总线上读取的高字节和低字节,调试时使用。
图2:
LM75A寄存器读写模块
本模块控制时序所使用的方法是状态机。
下面以读一个2字节寄存器(TEMP,THYST,TOS)为例,详述工作时序。
该模块上电之后应当先复位,使状态机进入等待状态。
状态机用一个2倍于通信速率的时钟在工作,并时时检测按键信号,当有按键按下检测到低电平时,此时状态机从等待状态转入发送起始位的状态。
起始位状态要做的事情是:
首先在一倍时钟高电平的一半的时候拉低数据线,然后SCL送时钟,同时进入下一个状态:
发送地址。
由于IIC总线要求数据在高电平的时候都不能变,因此我们所有对SDA线的写入操作全部在低电平的时候进行,高电平的时候数据保持稳定。
在地址线写完7位之后,紧接着写一位RW状态位,这里我们要写,所以这一位置零。
RW状态位写完后,进入等待器件应答位的状态。
在低电平的时候释放总线并在下一周期高电平的时候,检测总线是否被器件拉低。
如果已经变低,那么在时钟低电平的时候立刻重新控制数据线,开始写指针,共8位。
写指针的时序和之前地址帧的时序完全一致,这里不再赘述。
同样,写完指针帧之后同样要等待器件的一个ACK应答信号。
当检测到这个应答信号以后,重复一个起始信号,再继续写一个地址帧,写完地址帧之后,这次按照通信规定,RW状态位应该是读,也就是高电平。
写完高电平以后,释放总线,再次等待器件响应。
检测到响应以后,器件就开始往SDA上传输数据,状态机进入读总线的状态,在每个SCL的高电平的时候读取SDA总线的数据存入寄存器内部。
这就是一个基本的通信时序。
图3是对该模块进行的一个简单的仿真的部分时序图。
图3:
时序图
这个时序的难点有两个地方。
一是这个状态机的工作时钟要使一个高倍时钟,要比SCL线上的时钟快,这样才能比较方便的定位到一倍时钟的高低电平处。
当然,一倍时钟的状态机也是可以写出这个时序的,但是会比较繁琐。
二,释放总线要做到真正的释放总线。
我的程序里面释放总线使用了一个三态门,使用一个名为TRI的信号控制。
TRI为1的时候,工作正常,FPGA控制总线,向总线上写数据。
TRI为零的时候,对于FPGA来说,向SDA线上输出高阻,控制权交给器件,同时,三态门读入SDA的状态,用一个输出引脚引出,供读写寄存器的模块使用。
2.1.3除法电路
这部分电路用于将读出的寄存器值翻译成每一位数码管的字模。
由于测试时不会出现负温度,因此我这里的算法没有考虑负温度的情况。
不同的寄存器会有不同的翻译方法,比如temp寄存器是除以八后的到温度的二进制表示,thyst和tso寄存器要求除以2得到温度上下限的二进制码,而CONF寄存器只是一个单纯的工作模式没有实际的温度意义,而且它的高三位为厂商保留位上电以后清零,这个数的十进制不可能超过32,因此我定义它就直接翻译成十进制显示在数码管上,也就是除以1。
首先要根据不同的指针值推算出当前读取的寄存器,然后确定要除的数。
除完以后的商就是我们需要显示的整数部分的二进制码,余数部分就是小数。
小数部分可以直接用一个译码器,根据余数大小,余1显示.125,余2显示.25,依次类推。
而商的话,再除以100。
除以100的商就是百位。
余数就是个位和十位。
将这个商再除以十,那么商就是十位,余数就是个位。
那么经过两次除法,已经将三位十进制的每一位都独立出来了,剩下的就是根据BCD码推算出字模了,此处略去。
图4:
除法电路
2.1.4动态显示
这个模块是一个几乎必备的基本模块,几乎所有的设计都会用到。
动态显示的原理就是一个时钟周期内只显示一位,当时钟快了以后,由于人眼的视觉迟滞,就感觉不出来这种不连续了。
动态显示的频率控制在1k左右为佳。
图5:
动态显示电路
2.1.5报警电路
报警电路就是一个数据选择器,检测LM75AOS脚的输出(上电后默认低电平有效),高电平的时候蜂鸣器上加高电平,低电平的时候蜂鸣器上给一定频率的脉冲,此时就实现了报警功能。
图6:
报警电路
2.2直流电机控制部分
2.2.1PWM输出控制器
这是电机控制的核心。
PWM即PULSEWIDTHMODULATION脉冲宽度调制。
通过改变输入的占空比来调整输出脉冲的宽度,从而实现调整直流电机的转速。
模块比较简单,和分频器的原理类似,只不过分频器一般占空比为一半而这里的占空比可变罢了。
图7:
PWM输出控制器
2.2.2脉冲消抖电路和频率计
试验箱上的光电计数器产生的计数脉冲内部含有大量的干扰脉冲,必须经过整形以后才能输入给频率计。
脉冲消抖的原理和按键消抖的原理类似,都是用一定的时钟让输出在上升沿跟随输入的状态。
这样两个上升沿之间的抖动会被去掉。
这个时钟的选取要根据不同的器件而定,不能一概而论。
频率计有两种原理。
对于频率比较高的信号,我们可以设定一个闸门,这个闸门时间是一秒。
检测一秒内信号的上升沿个数,就是它的频率。
对于低频信号,可以测它两个上升沿之间的时间差,再取倒数就是频率了。
对于直流电机,显然第一种方法较为合适。
考虑到要能精确跟踪到输入的信号,频率计的工作时钟应该适当大些。
这里频率计工作时钟为20m。
原理还是状态机。
在使能高电平的时候,检测上升沿。
一旦进入低电平以后,将数据显示。
因此,频率计的输出只会在使能信号变低得时候改变,计数的时候不变。
图8:
脉冲消抖电路和频率计
2.2.3占空比控制器
要实现转速随温度变,就要实现占空比随温度变。
占空比在电路里就是一个5位二进制码控制的。
温度就是一个11位寄存器。
所以我们就想设定一个常数,用BIN温度值减去这个常数,取它的低5位,控制占空比。
温度越高,BIN温度值越高,差值越大,电机转速越快。
这个常数的计算就是用我们想要起转的温度的11位减去100(B)就可以了。
这个算法有个缺点。
当温度升高到一定值以后,最低的5位变成11111,再升高,就会变成00000,这时电机会停转,然后如果温度继续上升的话会继续,电机转速继续上升。
图9:
占空比控制器
2.2.4转速显示
这部分的原理同温度显示非常类似,同样也是通过若干次除法将转速的百位十位个位分离出来,再译码成段码显示。
图10:
转速显示
2.3串口通信部分
由于实验箱的按键不够,因此我想直接从电脑里输入一个8位的二进制数通过串口送给FPGA。
00H的时候切换为温度显示,FFH的时候切换为转速显示,其他的状态显示电路不变,但是此时可以按动实验箱上的开关将收到的数写进LM75A的TSO/THYST寄存器里来改变温度上下限。
2.3.1串口部分
UART是一种非常方便的低成本通信接口,无时钟。
常见的波特率有2400,4800,9600等。
由于没有时钟,因此对双方的波特率精度要求比较高,一半来说波特率误差不能超过5%。
我选择的波特率是2400。
同IIC总线一样,串口模块也是工作在高倍时钟下,而且这个时钟是8倍时钟,也就是说,这个串口模块的工作频率是19200HZ,检测数据线,一旦出现低电平,那么按照通信协议,每间隔8个周期采样一次,最低位最先出现,最高位在最后,然后会有一位或两位奇偶校验位,最后一位是停止位,为高。
通信双方必须协定好传输的位数,波特率,奇偶校验位。
为了避免寄存器输出出现不稳定的状态,我引入了一个接收指示信号,常态为低电平,下降沿代表接收完成,此时将寄存器的值赋给输出。
这个下降沿也指示后级控制电路来检查寄存器的值并完成译码工作。
图11:
串口部分
2.3.2串口译码及显示切换
显示切换其实就是一个最简单的数据选择器只不过这里要切换的路数比较多罢了。
串口译码的作用就是检测到接收指示信号的下降沿时,查寄存器的值。
如果是00H那么切换到温度显示。
如果是FFH,那么切换到转速显示。
如果是其他值,显示不变。
但是此时的寄存器值仍然可以写入TSO/THYST寄存器。
图12:
串口译码及显示切换
三实验总结
1.熟练使用语言,积累相关的编程经验是关键。
应该说IIC总线的通信时序和UART的通信时序是比较类似的,而我暑假在准备全国电子设计大赛的时候重点调试了一个UART通信模块,对时序控制及相关状态机的写法及状态间的跳转条件有了一定的了解。
有了这样一个基础再去调试IIC总线就显得比较从容了。
2.组间合作很重要。
比赛时我负责IIC总线的调试,而我的队友则在查找直流电机的相关资料,我总线调试好了以后,我队友把直流电机模块也研究的差不多了,立刻就能投入使用。
最后,衷心感谢刘光祖老师,薛文老师,花汉兵老师以及徐达龙学长,在暑假准备全国电子设计大赛时给予的倾力指导,为了准备全国电子设计大赛,我们队两个人暑假一直没有回家,一直在学校。
我负责我们队FPGA的调试,期间不断的和几位老师和学长交流,他们帮了我很多,我也学到了很多。
正是由于有了这些积累,我才在FPGA方面有了一定的进步,这和这次的获奖是密不可分的。
可以说,如果没有暑假时准备全国电子设计大赛的这样一个经历,没有老师们和学长的指导,我们队获奖的可能性是很低的。
所以,再次感谢几位老师和学长!