Код: Выделить всё
#include <mega16.h>
#include <m8_128.h>
#include <delay.h>
#include <stdio.h>
char pwm = 0; // Величина ШИМ начальная PWM в %
u32 pwm_val; // для хранения величины ШИМ PWM в 1/1024
void main(void)
{
PORTA=0x00; DDRA=0x00;
PORTB=0x00; DDRB=0x00;
PORTC=0x00; DDRC=0x00;
PORTD=0x00; DDRD=0x30;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0xA3;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH = 0x00; // PWM(PD4) OCR1B / 10.23 (%)
OCR1BL = 0xFF; // PWM(PD4) 255 / 10.23 = 24.9 (%)
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
MCUCSR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
while (1){
if (pwm > 102) { //если ШИМ уже более 100 %
pwm = 0; // обнулить величину ШИМ
};
pwm_val = ((1023 * (u32)pwm)/100);
// pwm_val - это число от 0 до 1023
// PWM(PD5) = OCR1A / 10.23 (%)
OCR1AH = (char)(pwm_val>>8);
OCR1AL = (char)pwm_val;
if(PINA.0==1){
pwm += 10; //увеличим ШИМ на 10%
}
delay_ms(20); // пауза
};
}Можете разъяснить, принцип работы этого кода и почему мы делим на 10.23
Код: Выделить всё
OCR1BH = 0x00; // PWM(PD4) OCR1B / 10.23 (%)
OCR1BL = 0xFF; // PWM(PD4) 255 / 10.23 = 24.9 (%)