在这个项目中,我们将使用ATMEGA8微控制器和火灾传感器制作火灾警报系统。火灾传感器可以是任何类型,但是我们使用的是基于IR(红外)的火灾传感器。尽管基于IR的火灾传感器主要具有一些不准确的缺点,但它是检测火灾的最便宜,最简单的方法。
基于IR的火灾传感器具有较小的感知范围,因此我们将火灾传感器安装在伺服电机上。伺服将进行180度摆旋转。在安装了火灾传感器的情况下,我们获得了270+度的火灾传感视野。伺服器将连续旋转,从而提供一个完整的房间火灾警报系统。为了提高准确性,我们可以在系统中添加烟雾传感器。这样我们可以获得更高的精度。
电路元件
硬件: + 5v电源,伺服电机(sg90),ATMEGA8,蜂鸣器,按钮,10KΩ电阻,1KΩ电阻,220Ω电阻,100nF电容器,AVR-ISP编程器。
软体: Atmel studio 6.1,progisp或flash magic。
电路图与工作
为了使伺服轴完全向左移动,我们需要提供1/18的开启比率,而为了使轴一直向左旋转,我们需要给PWM提供2/18的占空比。我们将对ATMEGA8进行编程,以发出一个PWM信号,该信号将使伺服轴旋转180度,然后经过一定的延迟后旋转至0。
在整个时间内,火警传感器将打开,并且控制器将处于完全警报状态。如果发生火灾,当控制器检测到传感器发出警报时,传感器会提供一个高脉冲。按下与之连接的重置按钮可以关闭警报。
在atmega8的三个PWM通道中,我们指定了三个引脚。我们只能在这些引脚上获取PWM输出。由于我们使用的是PWM1,因此应在OC1A引脚(PORTB第一个PIN)处接收PWM信号。如电路图所示,我们将伺服信号连接到OC1A引脚。这里的另一件事是三个PWM通道,两个是8位PWM通道,一个是16位PWM通道。我们将在这里使用16位PWM通道。
在ATMEGA中,有几种生成PWM的方法,它们是
1.相位校正PWM。
2.快速PWM。
在这里,我们将使一切保持简单,因此,我们将使用FAST PWM方法生成PWM信号。
首先选择PWM的频率,这通常取决于应用,对于LED,任何大于50Hz的频率都可以。因此,我们选择1MHZ计数器时钟,因此没有选择预分频器。预分频器是一个选择得较小的计数器时钟的数字。例如,如果振荡器时钟为8Mhz,我们可以选择预分频器“ 8”来获得1MHz的时钟作为计数器。根据频率选择预分频器。如果我们想要更多的时间周期脉冲,我们必须选择更高的预分频器。
现在要从ATMEGA中获得50Hz时钟的FAST PWM,我们需要启用“ TCCR1B ”寄存器中的相应位。
这里,
CS10,CS11,CS12(黄色)—选择预分频器以选择计数器时钟。下表显示了适用的预分频器表。因此,对于预分频(振荡器时钟=计数器时钟)。
因此CS10 = 1,另外两位为零。
红色(WGM10-WGM13):已更改为根据下表选择波形生成模式,以实现快速PWM。我们将WGM11,WGM12和WGM12设置为1。
现在我们知道PWM是具有不同占空比或不同打开/关闭时间的信号。到目前为止,我们已经选择了PWM的频率和类型。本章的主题位于本节中。为了获得不同的占空比,我们将选择一个介于0和255之间的值(由于8位,为2 ^ 8)。假设我们选择一个值180,因为计数器从0开始计数并达到值180,所以可能会触发输出响应。该触发可以是反相的或非反相的。也就是说,可以告诉输出在达到计数时拉高,或者可以告诉输出在达到计数时拉低。
GREEN(COM1A1,COM1A0):上拉或下拉选择由CM1A0和CM1A1位选择。
如表所示,在比较时输出为高电平,输出将保持高电平直到最大值。为此,我们必须选择反相模式,因此COM1A0 = 1; COM1A1 = 1。
如下图所示,OCR1A(输出比较寄存器1A)是存储用户选择值的字节。因此,如果我们更改OCR1A = 180,则当计数器从0达到180时,控制器将触发更改(高电平)。
对于180度,OCR1A必须为19999-600,对于0度,OCR1A必须为19999-2400。