пʼятницю, 16 січня 2015 р.

Апаратний ШІМ мікроконтролера Atmega8 + PWM+LCD







#include <mega8.h>
#include <delay.h>
#include <stdio.h>

#asm
   .equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>

#define ADC_VREF_TYPE 0x40// Опорна напруга АЦП з ножки AVCC
//TCCR1B
#define CS0 0
#define CS1 1
#define CS2 2
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
// global variables
unsigned int adc_code,old_code=1, pwm;
unsigned char string[10];//масив знаків для виводу на дисплей
void main(void)
{
// ADC initialization
// ADC Clock frequency: 250,000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x85;

DDRB=0xFF;//Порт Б на виход
//Fast PWM 8-bit
//OC1A встановлюється в 1 при свівпаданні (COM1A1=1, COM1A0=1)
//OC1B  скидається в 0 при свівпаданні (COM1B1=1, COM1B0=0)
TCCR1A=(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<WGM10);
TCCR1B=(1<<CS0)|(1<<WGM12);
// LCD module initialization
lcd_init(16);// Дисплей на 16 символів
lcd_clear();// Очищаємо дисплей
lcd_gotoxy(0,0);// Ставим курсор на 0 знак та 0 стрічку
lcd_putsf(" LCD PWM Control ");//Вивод повідомлення на нульову стрічку (першу)
lcd_gotoxy(0,1);// Ставим курсор на 0 знак та 0 стрічку
lcd_putsf("PWN 0-100%:    %");//Вивод повідомлення на нульову стрічку (першу)
delay_ms(100);
while (1)
      {
     adc_code=read_adc(0)/4;// Зчитуємо результат АЦП
     if(adc_code!=old_code) //Якщо значення з АЦП змінилось
    { 
     old_code=adc_code;
     pwm=(adc_code*100)/255;//Перетворення коду 0-1023 в 0-100% для виведення на lcd 
     sprintf(string, "%d",pwm);//формуємо стрінг із змінної "pwm" 
                                    //типу int в десятковому вигляді
     //заносим значення в регістри порівняння
       OCR1A=adc_code;   
       OCR1B=adc_code;
       lcd_gotoxy(12,1);               
       lcd_puts(string);// Виводимо значення змінної "pwm"
     }                  
     delay_ms(100);
       };
}







Немає коментарів :

Дописати коментар