Добрый вечер Господа форумчане, если кто-то работал с контроллером Attiny85?-не могли бы подсказать как мне настроить параметры контроллера , и работает ли контроллер от внешних резонаторов не стандартных частот например 13 мГц или 19мГц? Началось все с того что решил освоить эти устройства и программирование этих контроллеров , знаний ноль и практики так же. Симуляцию производил в Proteuse 8.17 sp4 , код на С ! Во общем начал с простого устройства преобразователь напряжения 12-220v с синусоидальных выходом и обратной связью по напряжению для стабилизации напряжения на нагрузке. Спойлер
Код:
#include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> #include <avr/pgmspace.h> //#include <util/delay.h> // Include for _delay_us() //#define F_CPU 13000000UL
DDRB |= (1 << PB2)| (0 << PB3)| (0 << PB4)| (0 << PB5); ADMUX = (1 << ADLAR) | // left shift result (0 << REFS1) | // Sets ref. voltage to VCC, bit 1 (0 << REFS0) | // Sets ref. voltage to VCC, bit 0 (0 << MUX3) | // use ADC2 for input (PB5), MUX bit 3 (0 << MUX2) | // use ADC2 for input (PB5), MUX bit 2 (0 << MUX1) | // use ADC2 for input (PB5), MUX bit 1 (0 << MUX0); // use ADC2 for input (PB5), MUX bit 0 ADCSRA = (1 << ADEN) | // Enable ADC (0 << ADPS2) | // set prescaler to 2, bit 2 (1 << ADPS1) | // set prescaler to 2, bit 1 (0 << ADPS0); // set prescaler to 2, bit 0 DDRB |= (1 << PB0); // (OC0A) PB0 выход шим прямой DDRB |= (1 << PB1); // PB1 (OC0B) выход шим инвертированный PLLCSR |= (0 << LSM); TCCR0A |= (1 << WGM01) | (1 << WGM00); // Fast PWM mode TCCR0A |= (1 << COM0A1) | (0 << COM0A0); // Non-inverting PWM on OC0A (PB0) TCCR0A |= (1 << COM0B1) | (1 << COM0B0); // inverting PWM on OC0B (PB1) TCCR0B = (0 << CS02) | (1 << CS01) | (0 << CS00); // Prescaler 1 для скорости ~50Гц TIMSK |= (1 << TOIE0); // Enable Timer 0 overflow interrupt sei(); // using interrupts while (1) { } }
ISR(TIMER0_OVF_vect) { static uint16_t sine_index = 0; // Статический индекс для таблицы синусов ADCSRA |= (1 << ADSC); // Запуск преобразования АЦП while (ADCSRA & (1 << ADSC)); // Ожидание завершения sine_value = pgm_read_byte(&sine_table[sine_index]); duty_cycle = (sine_value * (255 - ADCH) / 255) * 225 / 255 + 15; // Простая модуляция амплитуды и дедтайм для драйвера с транзисторами OCR0A = OCR0B = duty_cycle; sine_index = (sine_index + 1) % 512; // Увеличение индекса, обход таблицы }
Вот код, в Proteuse работает, и при небольшой переделки работает и на Attiny2313A только без обратной связи. Но интересует как выставить на выходе частоту 50Гц и частоту модуляции шим от 60 -100 кГц я думаю примерно неважно в этих пределах? Какие параметры фьюзов нужны ? Что у меня получилось, так это частота 31 кГц шим, и частота синусоиды 61Гц, заранее благодарен за помощь если чего не правильно подскажите . При подаче питания происходит генерация шим, с перебором таблицы синусоиды из 512 значений, которые управляют скваженностью. Для проверки если на любой из выходов например PB0 поставить цепь RC то на выходе будет синусоидальной сигнал. На вход PB5 подаётся сигнал обратной связи через делитель при меньшем напряжении больше ширина импульса и при большем напряжении меньше ширина импульса.
Вложения:
Комментарий к файлу: Код для протеуса cod_Attiny85_C.c [4.62 KiB]
Скачиваний: 54
Установите CKSEL3...0 1111 SUT1,0 11 Из DS режим FAST PWM 011 потребует Fcpu=50[Гц]*512*8*256=52'428'800[Гц]??? Если предделитель установить =1, то Fcpu=50[Гц]*512*1*256=6'553'600[Гц]. При кварце 13МГц и предделителе тактовой /2 (CLKPS3...0 0001) на выходе должно получиться ~49,6[Гц]
PWM= C+A*sin(N*360º/512) Постоянная C не должна меняться при регулировании амплитуды A, которая, в свою очередь, должна быть строго меньше C, чтобы ШИМ не вырождался в постоянный уровень. Например, C=128 и A=124.
Режим FAST PWM буферирован, поэтому параметры OC0A и OC0B заносятся аппаратно.
Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.
Всем привет кто интересовался проектом? Кому интересно добавил для Attiny85 код на Си , преобразователя напряжения синус примерно 54Гц частота шим 62.5 кГц, частота внутренего генератора 16мГц. Хотел сделать по принципу с выходным дросселем , как в усилителях class-D Код Си: Спойлер
int main(void) { // инициалицация параметров контроллера для Fast PWM и АЦП cli(); // Выключить прерывания DDRB &= ~(1 << PB5); // Настройка пина PB5 как вход для АЦП DDRB &= ~(1 << PB2);DDRB &= ~(1 << PB3);DDRB &= ~(1 << PB4); // Настройка пинов как входов ADMUX =
(0 << REFS0) | // Опорное напряжение от источника VCC, bit 7 (0 << REFS1) | // Опорное напряжение от источника VCC, bit 6 (1 << ADLAR) | // результат сдвигаем влево, ADLAR bit5 (0 << REFS2) | // Опорное напряжение от источника VCC, bit 4 (0 << MUX3) | // Включение входа (PB5) для ADC0, MUX bit 3 (0 << MUX2) | // Включение входа (PB5) для ADC0, MUX bit 2 (0 << MUX1) | // Включение входа (PB5) для ADC0, MUX bit 1 (0 << MUX0); // Включение входа (PB5) для ADC0, MUX bit 0 ADCSRA = (1 << ADEN) | // Включаем ADC (1 << ADATE) | // Включаем ADC Auto Trigger без этого значения не работает обратная связь (1 << ADPS2) | // Настройка преобразователя Коэффициент деления 2, bit 2 (1 << ADPS1) | // Настройка преобразователя Коэффициент деления 2, bit 1 (1 << ADPS0); // Настройка преобразователя Коэффициент деления 2, bit 0 ADCSRB = (0 << ADTS2) | (0 << ADTS1) | (0 << ADTS0); // Free Running mode for Auto Trigger DDRB |= (1 << PB0); // PB0 (OC0A) Выход шим DDRB |= (1 << PB1); // PB1 (OC0B) Выход шим TCCR0A |= (1 << WGM01) | (1 << WGM00); // Режим Fast PWM mode TCCR0A |= (1 << COM0A1) | (0 << COM0A0); // Прямой ШИМ для OC0A (PB0) TCCR0A |= (1 << COM0B1) | (1 << COM0B0); // Инвертированный ШИМ для OC0B (PB1) TCCR0B = (0 << WGM02) | (0 << CS02) | (0 << CS01) | (1 << CS00); // Prescaler 1 для скорости ~54Гц при таблице 1024 значений, при F_CPU 16000000 шим 62500 гЦ TIMSK |= (1 << TOIE0); // Включить прерывание для таймера ADCSRA |= (1 << ADIE); // Включить прерывание для АЦП OCR0A = 0; OCR0B = 0; // Начальное значение выходов sei(); // Прерывания while (1) { } }
ISR(TIMER0_OVF_vect) { // Прерывание по таймеру sine_index++; // счетаем от 0 до 1024 if (sine_index >= 1024) { //Если равно 1024 sine_index = 0; // То сбрасываем переменную в ноль и считаем сначала } sine_value = pgm_read_byte(&sine_table[sine_index]); // Читаем значение из таблицы ПОСЛЕ инкремента ADCSRA |= (1 << ADSC);// включаем преобразования АЦП }
ISR(ADC_vect) { uint8_t modulation_amplitude; // Результат модуляции синуса АЦП (0-255) uint8_t final_ocr_val_for_leg; // Конечное значение для OCR активного плеча uint8_t adc_modulation_factor = 255 - ADCH; //Обратная связь uint32_t product = (uint32_t)sine_value * adc_modulation_factor; // Преобразование значения синусоиды с учетом обратной связи modulation_amplitude = (uint8_t)((product + (product >> 8)) >> 8); // Деление на 255 быстрый метод const uint8_t MAX_PWM_DUTY_PUSH_PULL = 230; // максимальное рабочее значение ШИМ uint32_t scaled_product = (uint32_t)modulation_amplitude * MAX_PWM_DUTY_PUSH_PULL; // Маштабирование рабочего цикла ШИМ к мин и макс final_ocr_val_for_leg = (uint8_t)((scaled_product + (scaled_product >> 8)) >> 8); // Деление на 255 быстрый метод const uint8_t MIN_PWM_DUTY = 25; // минимальное рабочее значение ШИМ if (final_ocr_val_for_leg < MIN_PWM_DUTY ) { // исключение отрицательного значения и не ниже MIN_PWM_DUTY final_ocr_val_for_leg = MIN_PWM_DUTY; } OCR0A = final_ocr_val_for_leg; // вывод шим сигнала на выход PB0 прямой 62.500 кГц с модуляцией синусоидой 54Гц OCR0B = final_ocr_val_for_leg; // вывод шим сигнала на выход PB1 инверсия 62.500 кГц с модуляцией синусоидой 54Гц }
Фьюзы ставил Low Byte: 0xE1, High Byte: 0x7F, Extended Fuse Byte: 0xFE, Lock Bit Byte:0xFF По входу PB5 обратная связь, на который подаем выпрямленное напряжение с выходной обмотки трансформатора По выходам PB0 прямой и PB1 инвертированный ШИМ сигналы С самого начала сделал выходной каскад по схеме Push-Pull и драйвер ucc27425 у которого два входа один инверсный,с небольшой переделкой кода. Но для Push-pull максимальный рабочий цикл ШИМ ~48.2% , что неблагоприятно сказывается на качестве синусоиды учитывая что у нас 8bit ШИМ. Дальше решил попробовать сделать на печатной плате и по мостовой схеме для драйверов IRS2186, транзисторы IRFP4004PBF если есть какие нибудь советы рад буду применить, спасибо. Занимаюсь только в целях интереса, и и освоения микроконтроллеров.
Вложения:
Комментарий к файлу: Прошивка шил через XGesuPro48 ATTINY85_1.hex [4.04 KiB]
Скачиваний: 19
Комментарий к файлу: Fuses Attiny85 Attiny85_Fuses.png [14.38 KiB]
Скачиваний: 20
Комментарий к файлу: Для push-Pull Atiny85_push_pull_.c [6.73 KiB]
Скачиваний: 16
Комментарий к файлу: most Atiny85_Most.c [10.01 KiB]
Скачиваний: 15
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения