Примеры CodeVisionAVR - PWM & ЖКИ

Автор: Internet. Опубліковано в Початківцям з CV AVR

Зміст статті

 Делаем плавную цифровую регулировку . Для плавной регулировки используем ШИМ.
Широтно-импульсная модуляция (Pulse-width modulation (PWM)).
В CodeVisionAVR, выберем следующие установки:
 
Для реализации ШИМа используем Timer 2.Код:
Code
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
.hpinfotech.

Project : Fast PWM
Date : 21.02.2012
Company : c2.at.ua 
Chip type : ATmega8
Program type : Application
Clock frequency : 4,000000 MHz
*****************************************************/
#include <mega8.h>
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
#include <delay.h>
#include  
unsigned char lcd_buffer[16];
unsigned int tmp=128;
void main(void)
{
PORTB=0b00110000;
DDRB=0b00001000; 

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock //тактируется внутренним генеретором
// Clock value: 500,000 kHz //частота счета
// Mode: Fast PWM top=FFh //переведен в режим ШИМ
// OC2 output: Non-Inverted PWM //выход не инвертирован
ASSR=0x00;
TCCR2=0x6A; //выбор режима и частоты счетчика
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
lcd_init(16); // LCD module initialization
while (1)
{
if((PINB.4==0)&&(tmp !=0xff))
tmp+=1;
delay_ms(10); // задержка 10 мс. 

if((PINB.5==0)&&(tmp !=0x00))
tmp-=1;
delay_ms(10); // задержка 10 мс. 

OCR2 = tmp; // заполнение ШИМ от 0 до 255 

sprintf(lcd_buffer," PWM = %i%%",((tmp*100)/255)); // записуем в масив показания на экран 
lcd_clear(); // чистим дисплей перед выводом
lcd_puts(lcd_buffer); // выводим масив на LCD
delay_ms(50);

};
}

 
 
Скачать архив проекта исходник, proteus.