Zemāk redzamajā video tiek demonstrēta ventilatora ātruma regulācija, izmantojot mikrokontrollera ģenerētu impulsa platuma modulāciju (Pulse Width Modulation - PWM).
Shēmas darbības princips balstīts uz ATmega328P sērijas 8 bitu mikrokontrollera.
Elektriskās principiālās shēmas elektrobarošanai paredzēts izmantot 12 V spriegumu.
1.1.att. Fēna ātruma regulatora elektriskā principiālā shēma
Lai nodrošināt ventilatora griešanās ātruma regulāciju, tiek izmantots ATmega328P sērijas mikrokontrolleris, ar kura palīdzību tiek nodrošināta impulsa platuma modulācija.
Izmantojot vienu no divām spiedpogām, neieskaitot spiedpogu, kura paredzēta mikrokontrollera atiestatīšanai, iespējams palielināt vai samazināt aizpildījuma koeficienta vērtību, ar kura palīdzību tiek regulēts ventilatora griešanās ātrums.
R4-R6 rezistori paredzēti augsta signāla līmeņa piesaistei.
Izmantojot gaismas diodes (D1-D3), tiek attēlots ventilatora griešanās ātrums, bet R1-R3 rezistori paredzēti strāvas ierobežošanai caur gaismas diodēm.
X1 ārējais takts avots tiek izmantots, ja nepieciešams nodrošināt lielāku takts signāla frekvenci nekā 8 MHz (šajā gadījumā nav nepieciešams, bet tik un tā ir iekļauts shēmā), kur takts avota darbības stabilitātei paredzēti C1 un C2 keramiskie kondensatori.
Tā kā mikrokontrollera elektrobarošanai nepieciešams nodrošināt 5 V elektrobarošanu, bet ventilatoram paredzēts izmantot 12 V spriegumu, tad shēmā ir paredzēts L7805 sērijas lineārais sprieguma stabilizators.
C5 un C4 elektrolītiskie kondensatori paredzēti ieejas un izejas sprieguma pulsāciju gludināšanai, bet C3 un C6 keramiskie kondensatori paredzēti parazītiskās induktivitātes novēršanai.
Arī C7 keramiskais kondensators paredzēts elektrobarošanas traucējumu mazināšanai.
Q1 lauktranzistors paredzēts ventilatora vadībai, kur R7 rezistors paredzēts zema signāla līmeņa piesaistei pie aizvara, lai nodrošinātu pilnīgu lauktranzistora aizvēršanu, kamēr netiek sasniegta sliekšņa sprieguma vērtība.
Sistēmas informācijas attēlošanai ir paredzēts šķidro kristālu displejs (LCD1), kuram dati tiek padoti 4 bitu režīmā.
1.2.att. Testa slēgums
1.3.att. Informācijas attēlošana uz LCD
1.4.att. Informācijas attēlošana uz LCD
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <util/delay.h>
#include "lcd.h"
//==================================================================
//==================================================================
void PWM_inicializacija();
void LOW_ON();
void LOW_OFF();
void MID_ON();
void MID_OFF();
void HIGH_ON();
void HIGH_OFF();
int main(void){
unsigned int teksts="",tmp1="SKOLA 2017",tmp2="VeA", tmp3="Ventspils", tmp4="Augstskola";
unsigned int cnt=0;
unsigned int duty_cyc_a=127;
DDRD = 0xFF;
DDRC = 0x00;
DDRB = 0x37;
InitLCD(0);
LCDClear();
PWM_inicializacija();
while(1){
if(cnt==16){
teksts=tmp2;
}
else if(cnt==32){
teksts=tmp3;
}
else if (cnt==48){
teksts=tmp4;
}
else{
teksts=tmp1;
cnt=0;
}
_delay_ms(50);
for(int i=0;i<16;i++){
LCDClear();
LCDWriteStringXY(2,0,"DUTY");
LCDWriteIntXY(10,0,duty_cyc_a,4);
LCDWriteStringXY(i,1,teksts);
_delay_ms(300);
cnt++;
if (duty_cyc_a<85){
LOW_ON();
MID_OFF();
HIGH_OFF();
}
else if(duty_cyc_a>=85 && duty_cyc_a<170){
LOW_ON();
MID_ON();
HIGH_OFF();
}
else if(duty_cyc_a>=170){
LOW_ON();
MID_ON();
HIGH_ON();
}
else{
LOW_OFF();
MID_OFF();
HIGH_OFF();
}
if (!(PINC & (1<<PC4))){
if(duty_cyc_a==255){
duty_cyc_a=0;
OCR0A=duty_cyc_a++;
}
else{
OCR0A=duty_cyc_a++;
}
}
else if (!(PINC & (1<<PC5))){
if(duty_cyc_a==0){
duty_cyc_a=255;
OCR0A=duty_cyc_a--;
}
else{
OCR0A=duty_cyc_a--;
}
}
else{
OCR0A=OCR0A;
}
}
}
return 0;
}
void LOW_ON(){
PORTB|=(1<<PB3);
}
void LOW_OFF(){
PORTB&=(~(1<<PB3));
}
void MID_ON(){
PORTB|=(1<<PB4);
}
void MID_OFF(){
PORTB&=(~(1<<PB4));
}
void HIGH_ON(){
PORTB|=(1<<PB5);
}
void HIGH_OFF(){
PORTB&=(~(1<<PB5));
}
void PWM_inicializacija(){
OCR0A = 0; // Fast PWM
TCNT0 = 0;
TCCR0A |= (1 << COM0A1);
TCCR0A |= (1 << WGM01) | (1 << WGM00);
TCCR0B |= (1 << CS01);
}
1.5.att. Impulsa platuma modulācija