Перейти к содержанию

Fast Pwm На Timer1 Atmega8


COKPOWEHEU

Рекомендуемые сообщения

Устройство на ATmega8 (внешний кварц на 16 МГц, впрочем это не важно) используется для генерации ШИМ-сигнала на основе аппаратного OC1A (он же PB1). Началось все с бага в AVRStudio при симуляции. FastPWM (WGM1x=1110) она считает каким-то посторонним режимом и считает не до ICR1 а до 0x01FF, причем почему-то реверсивно. В железе и Протеусе такое не повторилось. Используется аппаратное формирование сигнала по OCR1A. Схема предельно простая - питание, кварц, PB1 - выход (на модели там висит осциллограф), на INT0(PD2) кнопка до земли. На моделях эти кнопки куда только не вешал. Собственно вопрос-то в общении с внутренностями а не с внешним миром.

TCCR1A=0b10001010;//выставлены биты прямого ШИМ на канале A (COM1A=0b10), аппаратный ШИМ разрешен (FOC1A=1)
TCCR1B=0b00011001;//Про WGM сказано в тексте. Эти 4 бира размазаны по TCCR1A и TCCR1B. Таймер работает на частоте ядра.
ICR1=0xFFFF;//модуль счета - максимум, я хочу получить все 16 разрядов сигнала.
TIMSK &= 0b11000011;//используется не только этот таймер и не только в этом режиме, поэтому все прерывания, которые от него зависят, отключаю.

Везде кроме Студии оно симулируется/работает как надо.

Необходимо по некоторому событию (пусть для определенности будет кнопка) надо менять скважность (фактически, значение OCR1A). Однако на прямое присвоение реакции почему-то нет, надо сначала забить все единицами и только потом присваивать то что надо

OCR1A=0xFFF9; OCR1A=0x8000;

Тогда оно работает нормально. Собственно вопрос, в чем причина (может, буферизация OCR1A?) и нельзя ли это обойти.

Была и еще одна бага с которой толком не разобрался. В процессе работы приходится отключать таймер и переводить его в обычный режим с прерыванием по сравнению B. При этом рандомно отключался то ШИМ то нормальный режим. Каким-то шаманством я это обошел, но хотелось бы понять с чем может быть связано.

Сейчас кода к 2-й ситуации нет, как смогу выложу. Понятно, что без него вряд ли чем можно помочь. Но хоть посоветуйте как это можно реализовать чтобы пересчитать как можно меньше подводных граблей.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Со второй проблемой разобрался. Просто перестал отключать таймер. Теперь меняется только его режим и вызываемые прерывания. Так он не чудит.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

аппаратный ШИМ разрешен (FOC1A=1)
Загадочный комментарий, данный бит выполняет другую функцию. Но на работу в данном случае никак не влияет.
Собственно вопрос, в чем причина (может, буферизация OCR1A?) и нельзя ли это обойти.

Буферизация тут не при чем, обходить нечего.

Вот этот код работает, проблем со сменой значения регистра нет.

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

#define F_CPU 16000000UL

void init()
{
DDRB = (1 << PB1);
PORTB = 0;

TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS11) | (0 << CS12) | (1 << CS10);
ICR1 = 0xFFFF;
}

int main(void)
{

init();

while(1)
{
OCR1A = 0x4000;
_delay_ms(500);
OCR1A = 0x8000;
_delay_ms(500);
OCR1A = 0xC000;
_delay_ms(500);
OCR1A = 0x0000;
_delay_ms(500);
}
}

Изменено пользователем BerZerKku
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Видимо, я не понимаю, за что отвечает FOC1A. Мне казалось, это флаг, чтобы при достижении TCNT1 значения OCR1A или ICR1 на выводе OC1 менялось значение. Или это только в режиме Normal?

Впрочем, запись из переменной все равно не получается. Скважность изменяется только при нажатой кнопке.

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

unsigned int value=0x0001;

int main(){
DDRB=0xFF;
DDRD=0x00; PORTD=0xFF;

TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS11) | (0 << CS12) | (1 << CS10);
ICR1 = 0xFFFF;

while(1){
 value+=0x1000;
 if(PIND == 0b11111110)OCR1A=0xFFFF;
 OCR1A=value;
 _delay_ms(500);
}
}

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Насчет FOC1A вы были правы,

In non-PWM Waveform Generation modes, the match output of the comparator can be forced by

writing a one to the Force Output Compare (FOC1x) bit.

Впрочем в ШИМ-режиме он ни на что не влияет. Впрочем для красоты кода лучше его и вправду убрать.

Немного смущает эта фраза из описания фич таймера:

- Double Buffered Output Compare Registers

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Регистр сравнения буферизирован, поэтому изменение его значения происходит после достижение счетным регистром максимального значения. Тем самым исключается возможность формирования несимметричных импульсов. Обойти, наверное, не удасться.

Ссылка на комментарий
Поделиться на другие сайты

да фиг бы с ним, счет F_CPU/2, то есть 8 МГц тактовая таймера, это 122 Гц частота возникновения прерываний в худшем случае. Даже такая точность меня устраивает. Плохо что из переменной оно даже и так не хочет записывать. А обойти как раз просто, TCNT1=0xFFFF; должно помочь. Дело-то не в этом

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Еще раз повторюсь, никаких проблем с записью в регистр нет, приведенный вами код работает без проблем. Попробуйте посмотреть что выходит из вашего компилятора, может дело именно в нем? Либо вы что-то не договариваете.

А почему частота счета в 2 раза меньше тактовой, если таймер работает без делителя? Вы одна сплошная загадка.

Ну а Геннадий вообще на своей волне.

uint16_t value = 0x0001;
void init()
{
DDRB = (1 << PB1);
PORTB = 0;
TCCR1A = (1 << COM1A1)  | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10);
TCCR1B = (1 << WGM13)  | (1 << WGM12)  |
   (0 << CS11)   | (0 << CS12)  | (1 << CS10);
ICR1 = 0xFFFF;
}
int main(void)
{
init();
while(1)
{
  value += 0x1000;
  OCR1A = value;
  _delay_ms(500);
}
}

Ссылка на комментарий
Поделиться на другие сайты

Точно так же не работает. Или это глюк протеуса? Ладно сегодня проверю на реальном железе.

Про таймер действительно спутал. До этого имел дело с СТС и пытался получить точную частоту, поэтому обратил внимание. А там f=F_CPU/(2*N*(1+X)). Для fast-ШИМ это f=F_CPU/(N*TOP). N-предделитель, X-регистр сравнения, TOP-модуль счета. В моем случае N=1, TOP=0xFFFF. Но здесь частота не слишком важна, даже если запись регистр будет происходить вдвое быстрее. Там она не происходит ни за 4мс, ни за 4 сек.

]BerZerKku, а вы на чем проверяли работоспособность?

Изменено пользователем COKPOWEHEU

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Благодарю, проблема решена. Оказалось, баг протеуса. В реальном железе все работает.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

P.S. Вторым режимом таймера, совместно с INT0, хотел отлавливать переход через 0 напряжения в сети чтобы реализовать регулировку мощности пропуском тактов, как альтернатива аппаратному ШИМу, только, по идее, дающая меньше помех. Сегодня проверил такой подход на практике. Пропуск даже 1 такта из 16 заметен и еще как. Лампочка, на которой все это тестировалось, мигала так что мне за нее было больно, перегорит ведь от такого надругательства. Короче от альтернативного режима пришлось отказаться а значит незачем переключать таймер туда-сюда. Впрочем, может кто подскажет как еще можно импульсно регулировать мощность порядка киловатта, без лишних помех? Аппаратно стоит (и меняться вряд ли будет) выпрямитель и полевик с опторазвязкой. Другая опротазвязка ловит импульсы выпрямленного сетевого напряжения (100 Гц пульсирующее) и передает на INT0 (PD2) контроллера.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Впрочем, может кто подскажет как еще можно импульсно регулировать мощность порядка киловатта, без лишних помех?

с этого и надо было начинать - с написания ТЗ и ТТХ для своего девайса, хотя бы в общих чертах.

и самое главное какого типа будет нагрузка??? ...от этого и будет зависеть способ регулирования.

Допустим вот сварочник на МК http://forum.cxem.net/index.php?showtopic=123537&st=0

Изменено пользователем lazertok

С Уважением

Если дело завершено, Человек должен усомниться. (закон Дао Ли)

Ссылка на комментарий
Поделиться на другие сайты

Нагрузка - накальные лампы, то есть просто резистивная. На тестовой настольной лампе ШИМ-регулировка работает, пропуск тактов - тоже работает, но мерцает страшно. Насколько я знаю, для нагревателей еще часто используют метод фазового регулирования. Может он будет давать меньше помех, тоже надо будет попробовать.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

DEL - про радио лампы сначала подумал.

получается - сеть (или другой источник), диодный мост, управляемый импульсный ключ на полевом, нагрузка накальные ламы до 1 кВт (пока) = готовая Эл.уда

может ошибаюсь???

для чего на МК???

потому как простых схем с авто регулированием мощности

для резистивной нагрузки на переменном токе и принципа их работы разработано много.

Опиши в чём заключается твои изыскания в этом направлении.

Это для информации:

Вот измеритель на МК на переменке, но в нём "нет управления" нагрузкой как такового тебе надо

http://cxem.net/izmer/izmer128.php

Вот "Электронный регулятор переменного напряжения" - по сути эл. латр с переключением обмоток на реле.

http://cxem.net/pitanie/5-269.php

Изменено пользователем lazertok

С Уважением

Если дело завершено, Человек должен усомниться. (закон Дао Ли)

Ссылка на комментарий
Поделиться на другие сайты

Схема управления да, выпрямитель, полевик, оптопара для определения прохождения напряжения через нуль и схема управления к полевику. Для контроллера это два вывода - синхроимпульс от сети и выход управления полевиком. Нагрузкой будут именно киловаттные лампы. Для проверки использовалась обычная настольная. Задача в термостабилизации некоего объекта, освещаемого лампами. Надо задать последовательность температур и выдержать их определенное время. Для этого контроллер и нужен. Схема уже собрана, основные узлы программы проверены, версия с одним ШИМом вроде была полностью работоспособной. Вроде - потому что проверить в реальности пока невозможно, но на модели (переменник вместо датчика и ручная обратная связь) регулировка заметна.

Вопрос был только про fast PWM режим ну и, может, есть не менее простые, но дающие меньше помех, способы регулировки мощности. Собственно, требования к схеме/алгоритму невелики: не менять существующую схему (мост+полевик). Основной вопрос решен - баги эмуляторов.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

похоже на инкубатор :)

1. Задача в термостабилизации некоего объекта, освещаемого лампами.

2. Надо задать последовательность температур и выдержать их определенное время.

Если объект посредством мощного света получает тепло, то 1 и 2 достаточно инерционные системы с такой мощностью,

если это одна лампа 1кВт, а не 10 шт по 100 Вт - относительно.

В таком случаи здесь скорей нужен датчик температуры с обратной связью по управлению мощностью накала лампы.

Не думаю, что лампой можно задать широкий диапазон температур,

тогда уж проще применять инфракрасные нагреватели + не мощные лампы просто для подсветки.

Из 2-го пункта следует, что регулировка идёт ступенчато и по программе.

Дальше не буду гадать... мало информации по девайсу.

Делать импульсную регулировку на полевом ключе с применением МК в данном случае не вижу смысла,

из-за сложности получения низких помех на пульсирующих токах от сети и думаю сложности написания проги на МК,

если именно освещением от лампы надо поддерживать температуру.

Вот на постоянном токе проблем бы не было.

В программировании МК я не силён. Извиняйте.

Для инерционной нагрузки на МК http://cxem.net/mc/mc3.php

Темы сайта на МК http://cxem.net/mc/mc.php

Изменено пользователем lazertok

С Уважением

Если дело завершено, Человек должен усомниться. (закон Дао Ли)

Ссылка на комментарий
Поделиться на другие сайты

Обратная связь - терморезистор. Вообще устройство было и раньше, но только с ручным управлением: человек смотрит сопротивление терморезистора и крутит ручку ЛАТРа. Так что если в оригинальной системе мощности хватало то мне бояться нечего. По поводу первой ссылки - подозрительно похоже на вариант с пропуском периодов пульсирующего напряжения. Для чего-то инерционного может и сгодится, но для ламп накаливания - вряд ли.

Что плохого в регулировке на полевом транзисторе? Я его выбрал потому что, в отличие от тиристора, его легко не только открыть, но и закрыть, для ШИМа идеально.

Про инфракрасные нагреватели можно поподробнее? Те лампы которые сейчас используются - от прожекторов, по форме напоминают карандаш. Само собой рефлектор, чтобы рассеивалось поменьше. С другой стороны, мощности у них достаточно.

Про "на постоянном токе проблем бы не было" тоже, если можно поподробнее. Строить импульсный регулятор можно на любом, а линейный на такую мощность сам будет неслабо греться.

С программированием контроллера проблем пока нет и по этой теме вряд ли появятся :-)

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

:bye: Ваша система более инерционная, чем я предполагал :yes: 1-е

1. Обратная связь - терморезистор...... с ручным управлением: человек смотрит сопротивление терморезистора и крутит ручку ЛАТРа.

2. По поводу первой ссылки

3. Что плохого в регулировке на полевом транзисторе? ... для ШИМа идеально.

4. Про инфракрасные нагреватели можно поподробнее?

5. Про "на постоянном токе проблем бы не было" тоже, если можно поподробнее.

6. С программированием контроллера проблем пока нет и по этой теме вряд ли появятся

2. Верно - для этого я и указал ссылку с пометкой "для инерционной нагрузки"

3. Ничего, но только на постоянном токе. на переменном/пульсирующем по входу ставят сначала ККМ, но это уже другая тема.

4. Это обычный ТЭН с открытыми спиралями.

Уж больно похожие вопросы по твоей теме http://forum.ixbt.co...048/007187.html

5. ШИМ регуляторы на МК - поиск в инете в помощь

6. уже появились в этой теме здесь.

Какую структуру вижу я для ламп

Сеть - 1кВт источник питания АС/DC (ККМ)- ШИМ на IGBT управляемый МК с обратной связью на термодатчике- лампа.

На ТЭН-ах будет без ККМ и проще.

П.С. регулятор с ШИМ от переменки на МК в чистом виде - пока я ни где не видел и думаю вряд ли ты его сделаешь.

Я тоже хотел бы думать, что это возможно, но слишком много :rake: по этому вопросу судя по форумам именно с МК.

у меня всё... удачи :bye:

Изменено пользователем lazertok

С Уважением

Если дело завершено, Человек должен усомниться. (закон Дао Ли)

Ссылка на комментарий
Поделиться на другие сайты

2. Система в целом может и более инерционна, но мне жаль лампочки. Вроде как им вредно слишком часто включаться-выключаться. А, как показал опыт, пропуск даже пары тактов, заметен на глаз.

3. Второй вариант, с фазовым регулированием, применяется на практике. Именно при пульсирующем/переменном токе.

4. ТЭН с открытыми спиралями может и более инерционен и, соответственно, прост в управлении, но эти спирали надо на чем-то наматывать, значит переделывать конструкцию. Неоправдано, на мой взгляд.

За ссылку спасибо, посмотрю. Правда, на первый взгляд, ничего нового там нет, но, может на второй появится.

5. Не понял к чему это. Вроде я уже упоминал что ШИМ-регулирование как раз работает как надо.

6. Уже решены в этой теме, поэтому я и написал что новые именно по ШИМу вряд ли появятся, по крайней мере от меня.

Не вижу особых преимуществ IGBT перед полевиком. По характеристиками должно хватить.

Насчет возможности реализации и :rake: посмотрим. В любом случае именно по этой теме (ШИМ) вроде все решено.

у меня всё... удачи :bye:
Спасибо.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Число-импульсным методом регулировать свечение лампы, конечно "не Айс". Когда ставили диод в цепь лампы накаливания (с цлью увеличения срока ее жизни), уже мерцание было заметно. Мне кажется больше подойдет регулировка угла открывания ключа (фазный способ). Только обратная по отношению к режиму управления тиристорами, т.е. ключ должен открываться в начале полупериода (при переходе напряжения через нулевой уровень), а закрываться по истечению длительности периода ШИМ.

По нагревателям, есть еще лампы с красным светофильтром-колбой. Я ими грею всякую фигню, от лака до раствора хлорного железа. Надо сказать, греют сильно.

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

COKPOWEHE

вот здесь в ветке по ИИП на нескольких страничках есть ответы/разъяснения по управлению с применением МК

http://forum.cxem.ne...40#comment-1636817

завершается тут http://forum.cxem.net/index.php?showtopic=1480&st=9060#comment-1638155

Изменено пользователем lazertok

С Уважением

Если дело завершено, Человек должен усомниться. (закон Дао Ли)

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...