ATtiny85 как реализ...
 
Уведомления
Очистить все

ATtiny85 как реализовать ШИМ

6 Посты
3 Пользователи
0 Likes
12.6 Тыс. Просмотры
Алмаз
(@aa)
Active Member
Присоединился: 14 лет назад
Сообщения: 9
Topic starter  

Кто нибудь сможет помощь с кодом для реализации ШИМ на Attiny85, как будет выглядеть примерно. если вопрос звучит не правильно можете исправить :)


Цитата
Radioded
(@sergey)
Estimable Member Admin
Присоединился: 5 лет назад
Сообщения: 184
 

Могу скинуть исходник для ATmega8 на ассемблере или вам на Си надо?


ОтветитьЦитата
akl
 akl
(@akl)
Estimable Member
Присоединился: 15 лет назад
Сообщения: 144
 

Если ассемблер устроит, посмотрите эту ветку. Там есть ШИМ и для tiny26 и для mega8
http://radiokot.ru/forum/viewtopic.php?f=2&t=26785&start=120


ОтветитьЦитата
Алмаз
(@aa)
Active Member
Присоединился: 14 лет назад
Сообщения: 9
Topic starter  

Могу скинуть исходник для ATmega8 на ассемблере или вам на Си надо?

а и тот и другой сможете скинуть? и еще, частоту ШИМ можно будет получить в пределах 100-1000кГц


ОтветитьЦитата
Radioded
(@sergey)
Estimable Member Admin
Присоединился: 5 лет назад
Сообщения: 184
 

Вот исходник на Си под WinAVR. Насколько я помню, микроконтроллер оцифровывал аналаговое напряжение на одном из входов и в зависимости от этого выдавал ШИМ-сигнал. Пример реализации ШИМ на микроконтроллере ATmega8:

// ATMEGA8 1MHZ; Fast PWM & ADC

#include <avr/io.h>
#include <util/delay.h>

unsigned char x;

void init(void){
ADCSR = 0b10000011; // Вкл. Ацп, Однокр. преобр., Прерывание запрещено
ADMUX = 0b01000000; // AVcc, Внеш. конд. на Aref, Выравн. по лев. краю

PORTB = 0x00;
DDRB = 0b00000010; // PortB.1 (OC1A) - Output
DDRC = 0x00; // inputs

TCCR1A = 0b10000011; // неинв. 10 битный ШИМ
TCCR1B = 0b00001010; // CK/8
TIMSK = 0x00;

return 0;
}

int adc_convert(char channel){
char temp, temp2;
int result, result2;

ADMUX = channel; // выбор канала
ADCSR = ADCSR | 0b01000000; // Start Convertion

while ((ADCSR && 0b01000000) != 1){ // wait until converting
};

temp = ADCL; // просто формальность (первым всегда читается ADCL)
temp2 = ADCH; //

result = (int)temp;
result2 = (int)temp2;
result2 = ( result2 << 8 );
result = (result | result2 );

return result;
}

void pwm_out(int level){
OCR1A = level;
return 0;
}

int main(void){
init();
while(1){
x = adc_convert(0b01000101); // PC.5 -input
pwm_out(x);
};
}


ОтветитьЦитата
Алмаз
(@aa)
Active Member
Присоединился: 14 лет назад
Сообщения: 9
Topic starter  

Спасиб


ОтветитьЦитата