Vkulagin24@gmail.com 6 Report post Posted July 1, 2018 Помогите пожалуйста кто умеет и знает нужно увеличить частоту ШИМ в данном коде ШИМ 18 герц и предназначение этого кода управлять температурой паяльника(12вольтового) а я хочу управлять электродвигателем печки авто. Мне очень понравилась как устроена управление одной кнопкой но вот частота маловато для управления эл.двигателем знаю что нужно что бы никаких звуков не исходила от моторчика печки частота шин должна быть больше 20кГц. Есть исходник вот часть его я предполагаю что нужно что то тут менятьDDRB |= (1 << PB0); //Ножка PB0 как выход(ШИМ)TCCR0A = (1 << COM0A1) | (1 << WGM00); //выбор ШИМ с фазовой коррекциейTCCR0B = 0x05; //Предделитель - 1024 и старт таймераTCNT0 = 0; // Сброс счетчика прерываний(0-255)OCR0A=0; //Выбор Значения ШИМа что нужно не знаю, я читал про шим attiny13 но так и не разобрался . А вот и исходник в Bascom /*/* * SolderPWM.c * * Created: 05.11.2017 23:33:14 * Author LampCORE.ru: */ #define F_CPU 9600000UL //частота процессора 9,6 Мгц#include <avr/io.h>#include <util/delay.h>#include <avr/interrupt.h>#include <avr/eeprom.h> //макросы для включения, выключения светодиодов//низкий уровень - на ножке 0 вольт, высокий уровень - на ножке 5 вольт#define LED1_OFF PORTB &= ~(1<<PB4); //Низкий уровень ножки PB4#define LED2_OFF PORTB &= ~(1<<PB3); //Низкий уровень ножки PB3#define LED3_OFF PORTB &= ~(1<<PB2); //Низкий уровень ножки PB2 #define LED1_ON PORTB |= (1<<PB4); //Высокий уровень ножки PB4#define LED2_ON PORTB |= (1<<PB3); //Высокий уровень ножки PB3#define LED3_ON PORTB |= (1<<PB2); //Высокий уровень ножки PB2//Указатели для EEPROMuint8_t autosave_p EEMEM; uint8_t level_p EEMEM;//Переменная для выбора режима ШИМuint8_t level=0;//volatile - чтобы компилятор не трогал эти переменные и не оптимизировал//Счетчики в прерывании//для миганияvolatile uint8_t count=0;//для переливания 3х светодиодовvolatile uint8_t count2=0;//счетчик удержания кнопкиvolatile uint8_t i=0;//переменная для события был_кликvolatile uint8_t wasclick=0;//36 переполнений (36 раз происходит событие TCNT0>255 ) = 1 секунда// Прерывание по совпадению счетчика таймера с OCR0A// 9 600 000 Гц/Предделитель 1024 / 1000 = 9 375 Гц в секунду/255=36 прерываний//в секундуISR (TIM0_COMPA_vect){ //инкремент счетчиков, две переменные, чтобы режимы//светодиодов мигания и переливания не зависили друг от другаcount++;//если больше пол секундыif(count>18){count=0;} count2++; //если больше секунды if(count2>36){count2=0;} } //функция отключить все светодиодыvoid off_all_led(){ LED1_OFF;LED2_OFF;LED3_OFF;} int main(void) { // Настраиваем порты ввода/вывода DDRB |= 1<<PB4;//Ножка PB4 как выходDDRB |= 1<<PB3;//Ножка PB3 как выходDDRB |= 1<<PB2;//Ножка PB2 как выход DDRB |= 0<<PB1;//Ножка PB1 как вход(кнопка)PORTB |= (1 << PB1);//Включаем подтягивающий Pull-UP резистор для ножки//PB1(вход-кнопка)(высокий уровень(+5Вольт)) DDRB |= (1 << PB0); //Ножка PB0 как выход(ШИМ)TCCR0A = (1 << COM0A1) | (1 << WGM00); //выбор ШИМ с фазовой коррекциейTCCR0B = 0x05; //Предделитель - 1024 и старт таймераTCNT0 = 0; // Сброс счетчика прерываний(0-255)OCR0A=0; //Выбор Значения ШИМ TIMSK0=0x04;//Разрешить выполнение прерываний по совпадению в OCR0A sei();// Разрешить глобальные прерывания //Индикация включения, быстрое переливание светодиодов с инвертированием LED3_ON; _delay_ms(45); LED3_OFF; LED2_ON; _delay_ms(45); LED2_OFF; LED1_ON; _delay_ms(45); LED1_OFF; LED2_ON; _delay_ms(45); LED2_OFF; LED3_ON; _delay_ms(45); LED3_OFF; //переменная для хранения значения автосохранения включено\выключено uint8_t autosave; //считать значение автосохранения с EEPROM по адресу в &autosave_p autosave=eeprom_read_byte(&autosave_p); //если сохранение включено то режим ШИМ равен значению из EEPROM if (autosave==1) { level=eeprom_read_byte(&level_p); //Проследовать сразу на метку handler_button, где //сразу инициируется режим, считанные из EEPROM goto handler_button; } //Бесконечный цикл while(1) { //Если на PB1 низкий уровень(если кнопка нажата) if( ! (PINB & (1 << PB1))) {//Событие был_клик произошлоwasclick=1;//инкремент счетчика нажатия кнопки до i=255if (i!=255){ _delay_ms(83); i++; //если прошло 3 и более секундif (i>=36) { //Событиея был_клик НЕ было wasclick=0; //если автосохранение включено - отключить, записать// это в EEPROM if (autosave==1) { eeprom_write_byte(&autosave_p,0); autosave=0; } //если автосохранение выключено - включить, записать в EEPROM else { eeprom_write_byte(&autosave_p,1); autosave=1; } //если автосохранение включено включить светодиод 1 на 1,5 секунды if (autosave==1) { LED1_ON; _delay_ms(1500); LED1_OFF; //перейти сразу к обработке переменной level goto handler_button; } else //иначе, если автосохранение выключено включить светодиод 3 на//1,5 секунды { LED3_ON _delay_ms(1500); LED3_OFF; //перейти сразу к обработке переменной level goto handler_button; } i=0;//сброс счетчика после долгого нажатия //перейти сразу к обработке переменной level goto handler_button; }//i>=36 }//i!=255 }//! (PINB & (1 << PB1)) // Выполнять только, если кнопка отпущена т.е. выполняется, только, если wasclick=1//(событие был_клик произошло)if ( (PINB & (1 << PB1))&&wasclick==1) { //события был_клик не было wasclick=0;_delay_ms(83);//Точные числа перескакивают, в узкий диапазон попасть трудно, поэтому от 2х до 12,// 2*83+83=249 миллисекунд//если кнопка была нажата (+83миллисекунды пауза внутри условия) 83*2 миллисекундif (i>=2&&i<=12){// повысить режимlevel++;//если режим превышает 7 сделать режим 0if(level>8){level=0;} //если включено автосохранение записать в EEPROM значение// режима if (autosave==1) { eeprom_write_byte(&level_p,level); } //метка обработки переменной level(режимов) handler_button: switch(level) { //каждому значению level - свое значение ШИМ и режим//светодиодов case 0:OCR0A=0;off_all_led();break; case 1:OCR0A=32 ;off_all_led(); break; case 2:OCR0A=64;off_all_led() ;break; case 3:OCR0A=96;off_all_led() ;break; //Если быстро нажать кнопку count2 не сбросится и какой-либо // светодиод будет гореть //некоторое время вместо того, чтобы погаснуть - переливания не // будет //принудительно сбросим count2 case 4:OCR0A=128;off_all_led();count2=0;break; case 5:OCR0A=160;off_all_led() ; LED1_ON; break; case 6:OCR0A=192;off_all_led() ; LED1_ON;LED2_ON; break; case 7:OCR0A=224;off_all_led() ; LED1_ON;LED2_ON;LED3_ON; break; case 8:OCR0A=255;off_all_led();break; }//switch i=0;//сброс счетчика кнопки }//i>=2 }//release отпущено //Мерцания светодиодов //Каждому значению ШИМ - свой режим светодиодов switch(level) { case 0:;break; case 1: //count прибавляется на 9 за пол секунды if(count>=0&&count<9){LED1_ON;} if(count>9&&count<=18){LED1_OFF;} ; break; case 2://if(count>=0&&count<9){LED2_ON;}if(count>9&&count<=18){LED2_OFF;} ;break;case 3://if(count>=0&&count<9){LED3_ON;} if(count>9&&count<=18){LED3_OFF;} ;break;case 4://переливания, свой счетчик count2if(count2>=0&&count2<6){LED3_OFF;LED2_OFF;LED1_ON} if(count2>6&&count2<=12){LED1_OFF;}if(count2>=12&&count2<18){LED1_OFF;LED3_OFF;LED2_ON}if(count2>18&&count2<=24){LED2_OFF;}if(count2>=24&&count2<30){LED2_OFF;LED1_OFF;LED3_ON}if(count2>30&&count2<=36){LED3_OFF;} ;break;case 5: ;break;case 6:;break;case 7:;break;case 8: if(count>=0&&count<9){LED1_ON;LED2_ON;LED3_ON;}if(count>9&&count<=18){LED1_OFF;LED2_OFF;LED3_OFF;} ;break; } }//while }//main 1 Ridgecler reacted to this Share this post Link to post Share on other sites
VitalForce 67 Report post Posted July 2, 2018 Я не специалист в AVR.. но. Мои предположения. Во первых частота внутреннего генератора выставлена максимальная, больше не выжать. Если только внешний ставить. Попробуйте поиграть с предделителем. TCCR0B = 0x05; //Предделитель - 1024 и старт таймера TCCR0B = 0x04; //Предделитель - 256 TCCR0B = 0x03; //Предделитель - 64 TCCR0B = 0x02; //Предделитель - 8 TCCR0B = 0x01; //Предделитель - 1 Других мыслей пока нет. 1 Vkulagin24@gmail.com reacted to this Share this post Link to post Share on other sites
Vkulagin24@gmail.com 6 Report post Posted July 2, 2018 Спасибо ,пока не могу скомпилировать , только сегодня узнал какой программой это нужно сделать еще не скачивал ее Share this post Link to post Share on other sites
Vkulagin24@gmail.com 6 Report post Posted July 3, 2018 Так и не получилось у меня создать хекс файл того что не компилируется , наверное где то ошибка если есть возможность скомпилируйте кто может и добавте сюда пожалуйста хекс файл . И что интересно я нашел прошивку на 19кГц так мосфет сильно греется , драйвер для мосфета на комплиментарной паре я собирал не помогает ВСе ровно греется очень Share this post Link to post Share on other sites
Vkulagin24@gmail.com 6 Report post Posted July 3, 2018 Если вдруг кто то мне поможет и сделает хекс файл то частота шим делайте 150гц при такой частоте хоть транзистор не греется Share this post Link to post Share on other sites
VitalForce 67 Report post Posted July 4, 2018 https://lampcore.ru/%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA/%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B9-%D1%88%D0%B8%D0%BC-%D0%BD%D0%B0-attiny13-%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D0%B8%D1%80%D1%83%D0%B5%D0%BC-%D0%B2%D1%81%D1%91/ Share this post Link to post Share on other sites
Vkulagin24@gmail.com 6 Report post Posted July 4, 2018 Я с этого сайта что вы мне дали и собираюсь собирать регулятор оборотов вентилятора печки. Всем спасибо все сделал благодаря умным людям я наконец-то подправил исходник для частоты шим сделал хекс файл около 200герц и 2.4кГц буду собирать схему на пакете уже все отладил Share this post Link to post Share on other sites
Vkulagin24@gmail.com 6 Report post Posted July 4, 2018 Огромное спасибо. Share this post Link to post Share on other sites