Работа Attiny85 от внешнего кварцевого резонатора?
Добавлено: Пт фев 21, 2025 20:34:35
Добрый вечер
Господа форумчане, если кто-то работал с контроллером Attiny85?-не могли бы подсказать как мне настроить параметры контроллера , и работает ли контроллер от внешних резонаторов не стандартных частот например 13 мГц или 19мГц?
Началось все с того что решил освоить эти устройства и программирование этих контроллеров , знаний ноль и практики так же.
Симуляцию производил в Proteuse 8.17 sp4 , код на С !
Во общем начал с простого устройства преобразователь напряжения 12-220v с синусоидальных выходом и обратной связью по напряжению для стабилизации напряжения на нагрузке.
Вот код, в Proteuse работает, и при небольшой переделки работает и на Attiny2313A только без обратной связи.
Но интересует как выставить на выходе частоту 50Гц и частоту модуляции шим от 60 -100 кГц я думаю примерно неважно в этих пределах? Какие параметры фьюзов нужны ? Что у меня получилось, так это частота 31 кГц шим, и частота синусоиды 61Гц, заранее благодарен
за помощь если чего не правильно подскажите . При подаче питания происходит генерация шим, с перебором таблицы синусоиды из 512 значений, которые управляют скваженностью. Для проверки если на любой из выходов например PB0 поставить цепь RC то на выходе будет синусоидальной сигнал.
На вход PB5 подаётся сигнал обратной связи через делитель при меньшем напряжении больше ширина импульса и при большем напряжении меньше ширина импульса.
Господа форумчане, если кто-то работал с контроллером 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
volatile uint16_t sine_value;
volatile uint16_t duty_cycle ;
const uint16_t PROGMEM sine_table[512] = {
127, 129, 130, 132, 133, 135, 136, 138, 139, 141, 143, 144, 146, 147, 149, 150,
152, 153, 155, 156, 158, 159, 161, 163, 164, 166, 167, 168, 170, 171, 173, 174,
176, 177, 179, 180, 182, 183, 184, 186, 187, 188, 190, 191, 193, 194, 195, 197,
198, 199, 200, 202, 203, 204, 205, 207, 208, 209, 210, 211, 213, 214, 215, 216,
217, 218, 219, 220, 221, 223, 224, 225, 226, 227, 228, 228, 229, 230, 231, 232,
233, 234, 235, 236, 236, 237, 238, 239, 239, 240, 241, 242, 242, 243, 244, 244,
245, 245, 246, 247, 247, 248, 248, 249, 249, 249, 250, 250, 251, 251, 251, 252,
252, 252, 253, 253, 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
255, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 253, 253, 253, 253, 252,
252, 252, 251, 251, 251, 250, 250, 249, 249, 249, 248, 248, 247, 247, 246, 245,
245, 244, 244, 243, 242, 242, 241, 240, 239, 239, 238, 237, 236, 236, 235, 234,
233, 232, 231, 230, 229, 228, 228, 227, 226, 225, 224, 223, 221, 220, 219, 218,
217, 216, 215, 214, 213, 211, 210, 209, 208, 207, 205, 204, 203, 202, 200, 199,
198, 197, 195, 194, 193, 191, 190, 188, 187, 186, 184, 183, 182, 180, 179, 177,
176, 174, 173, 171, 170, 168, 167, 166, 164, 163, 161, 159, 158, 156, 155, 153,
152, 150, 149, 147, 146, 144, 143, 141, 139, 138, 136, 135, 133, 132, 130, 129,
127, 125, 124, 122, 121, 119, 118, 116, 115, 113, 111, 110, 108, 107, 105, 104,
102, 101, 99, 98, 96, 95, 93, 91, 90, 88, 87, 86, 84, 83, 81, 80,
78, 77, 75, 74, 72, 71, 70, 68, 67, 66, 64, 63, 61, 60, 59, 57,
56, 55, 54, 52, 51, 50, 49, 47, 46, 45, 44, 43, 41, 40, 39, 38,
37, 36, 35, 34, 33, 31, 30, 29, 28, 27, 26, 26, 25, 24, 23, 22,
21, 20, 19, 18, 18, 17, 16, 15, 15, 14, 13, 12, 12, 11, 10, 10,
9, 9, 8, 7, 7, 6, 6, 5, 5, 5, 4, 4, 3, 3, 3, 2,
2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2,
2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 9,
9, 10, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20,
21, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36,
37, 38, 39, 40, 41, 43, 44, 45, 46, 47, 49, 50, 51, 52, 54, 55,
56, 57, 59, 60, 61, 63, 64, 66, 67, 68, 70, 71, 72, 74, 75, 77,
78, 80, 81, 83, 84, 86, 87, 88, 90, 91, 93, 95, 96, 98, 99, 101,
102, 104, 105, 107, 108, 110, 111, 113, 115, 116, 118, 119, 121, 122, 124, 125
};
int main(void) {
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; // Увеличение индекса, обход таблицы
} Но интересует как выставить на выходе частоту 50Гц и частоту модуляции шим от 60 -100 кГц я думаю примерно неважно в этих пределах? Какие параметры фьюзов нужны ? Что у меня получилось, так это частота 31 кГц шим, и частота синусоиды 61Гц, заранее благодарен
На вход PB5 подаётся сигнал обратной связи через делитель при меньшем напряжении больше ширина импульса и при большем напряжении меньше ширина импульса.