85-я тинька в режиме PWM с комплементарными выходами и аппаратным DeadTime

-NMi-
Offline
Зарегистрирован: 20.08.2018

Собсна хочу меандр на аппаратных выводах таймера №1. Вроде меандр получается, но как менять у него частоту, желательно плавно.. непонятно. Любое изменение счётных регистров ничего не даёт, кроме OC1C, но если его менять - меняется коэффициент наполнения ШИМ. Это вообще возможно?

DeadTime меняется прекрасно.

Если менять предделитель - частота меняется тоже, но скачками.

Кто "бодался" ???

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Даташит почитать предлагать ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kakmyc пишет:
Даташит почитать предлагать ?

https://www.youtube.com/watch?v=aw10753OJyg

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ТС, встречный вопрос:" а как на atmega328, сделать плавную смену частоты меандра аппаратно ?"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

-NMi- пишет:
Это вообще возможно?

Смотря что Вы понимаете под словом плавно. Вот, например, здесь, если играть первым параметром (ну, и вторым, когда уж надо), то плавно или нет? ХЗ!

enum T0_Prescaler { T0_P1 = 1, T0_P8 = 2, T0_P64 = 3, T0_P256 = 4, T0_P1024 = 5 };

//
//	Установка меандра на ноге OC0A
//	Частота = Fclk / (2 * prescaler * (ocr0a + 1))
//
static void timer0Configure(const uint8_t ocr0a, const T0_Prescaler prescaler = T0_P1) {
	DDRB |= bit(PB0);	// PB0 - он же OC0A
	GTCCR = 	bit(TSM);
	TCCR0A = bit(COM0A0) | bit(WGM00) | bit(WGM01);
	TCCR0B = bit(WGM02) | prescaler;
	TCNT0 = 0;
	OCR0A = ocr0a;
	OCR0B = 0;
	TIMSK = 0;
	GTCCR &= ~bit(TSM);
}


void setup(void) {
	timer0Configure(123, T0_P64);
}

void loop(void) {}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Кстати, а почему обязательно PWM режим? Чем плох СТС?

-NMi-
Offline
Зарегистрирован: 20.08.2018

ЕвгенийП пишет:

Кстати, а почему обязательно PWM режим? Чем плох СТС?

Петрович, ну и все остальные, --- в режиме СТС НЕ РАБОТАЕТ КОМПЛЕМЕНТАРНЫЙ ВЫХОД !!!

Вы чо реально думаете, шо я не умею генерить частоту авр-кой??? ))))))))))))))))))))))))))))))))))))))))))))))

Вопрос-то был про AtTiny85 про режим генерации PWM with DeadTime on Timer1B с КОМПЛЕМЕНТАРНЫМИ выходами!!! 

Ёпта))))))))))))))))))))))))))))))))))))))))))))))

-NMi-
Offline
Зарегистрирован: 20.08.2018

Kakmyc пишет:
ТС, встречный вопрос:" а как на atmega328, сделать плавную смену частоты меандра аппаратно ?"

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

-NMi-
Offline
Зарегистрирован: 20.08.2018

Вот картинко, сверху (для теста) Timer0 в режиме PWM, канал А и В тут всё прекрасно.

Снизу ДВА канала но только от Timer1B в режиме DeadTime PWM. Timer1A аппаратно отключен от выходов.

Это для понимания вопроса.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

-NMi- пишет:
Вопрос-то был про AtTiny85 про режим генерации PWM with DeadTime on Timer1B с КОМПЛЕМЕНТАРНЫМИ выходами!!!

Внимательно перечитал вопрос в стартовом топике. НИЮХА не нашёл ни про КОМПЛЕМЕНТАРНЫЕ выходы, ни про Timer1B!

Значит, я трахался и писал Вам пример плавного изменения частоты "в пользу бедных"!

-NMi- пишет:
Ёпта))))))))))))))))))))))))))))))))))))))))))))))

-NMi-
Offline
Зарегистрирован: 20.08.2018

ЕвгенийП пишет:

НИЮХА не нашёл ни про КОМПЛЕМЕНТАРНЫЕ выходы, ни про Timer1B!

Значит, я трахался и писал Вам пример плавного изменения частоты "в пользу бедных"!

Питрович, а НАЗВАНИЕ ТЕМЫ почитать никаГ нисутЪба?

И, блЕЕ, про Timer1B опять-же ПРОЧИТАТЬ НИСУТъБА???

ЗначитЪ ты не трахалсО, ибо трАханЪя твои не имеют смысла, вооПЩе, т.к. толку от них lim x--->0

Пасиму, Дет, есличО, пущай тема повисит на выходных, поЖЖе=удаляй.

Я сам найду решение своего вопроса!

sadman41
Offline
Зарегистрирован: 19.10.2016

Твоя основная проблема не тиньке и таймерах, а в неумении делать выводы.

В противном бы случае давно бы уже понял, что говнюков нигде не любят (удафком - исключение), их проблемы никого не волнуют и помощь им интереса не представляет.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

-NMi- пишет:

 Любое изменение счётных регистров ничего не даёт, кроме OC1C, но если его менять - меняется коэффициент наполнения ШИМ. 

-NMi- пишет:

Вы чо реально думаете, шо я не умею генерить частоту авр-кой??? ))))))))))))))))))))))))))))))))))))))))))))))

Если вы задали вопрос №1, то да, не умеете. По крайней мере умеете, но не понимаете до конца принципы работы таймера.  Частота и duty в таймере -два связанных параметра. Изменили OCR1C - пересчитывайте заново OCR1A(B) что бы сохранить нужный duty. 

-NMi-
Offline
Зарегистрирован: 20.08.2018

sadman41 пишет:
их проблемы никого не волнуют и помощь им интереса не представляет.

Таки ххде ты узрел, шо я просил помощи? Я спросил, кто бадалсИ т 85 тиней..

-NMi-
Offline
Зарегистрирован: 20.08.2018

dimax пишет:

По крайней мере умеете, но не понимаете до конца принципы работы таймера. 

Похоже на правду.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Вот код для плавного изменения частоты таймера 1 в режиме PWM с дед таймами. Всё, как заказывали.

Частота изменяется от 1 до 50 КГц, снова и снова и снова! ;)))

Видео: https://youtu.be/nc0ossGQY6Q как обычно.

И код.

#include <avr/io.h> //регистры с именами
#include <math.h> //в первой версии я логарифм использовал, но NMi врядли знает, что это такое! ;))


void setup() {
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);

  DTPS1 = 3;  //умножитель на 8
  DT1A  = 0x99; //для каждого края дед-тайм по 9*8 тактов

}

void loop() {
  static uint32_t f = 1000; //начальная частота
  if (f > 50000) f = 1000; //конечная

  uint16_t wOCR1C = 16000000ul/f; //делитель частоты
  byte ps = 1; //посчитаем, сколько от делителя загнать в предделитель
  while (wOCR1C > 256) {
    wOCR1C >>= 1;
    ps++;
  }
  wOCR1C = constrain (wOCR1C - 1, 128, 255);//а остальное в регистр топа счетчика
  
  OCR1C = wOCR1C & 0xff;
  OCR1A = (wOCR1C * 30 / 100) & 0xff; // заполнение ШИМа 30 % для наглядности
  TCCR1 = 0b01010000 | ps & 0x0f; //первые 0101 - режим PWM с комплиментарными выходами
  
  delay(50);
  f+=5;
}//больше нечего комментировать :(( пичалька!

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:

Вот код ...

Зачем?

Поощряешь поведение ТС? Ну-ну.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ну стало человеку интересно, размял мозги. Ничего плохого в этом не вижу. Сказать что это поощрение, спорно. Все равно если ничего не дорабатывать и в коде не разбираться для ТС поучительно, но бесполезно :) 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

wdrakula пишет:

Вот код ...

Зачем?

Поощряешь поведение ТС? Ну-ну.

нет, чтоб на вашем любимом:
 

    >+[>>,----------[>,----------]+++++[<-------->-]<[>>-<]>+[
    -<+++++++[<------>-]<[>>-<]>+[
    -<<[>>-<]>+[<<->>->]>
    ]<+++++++[<++++++>-]>>
    ]<++++++++[<+++++>-]<
    [<]<[>>[++++++++++.>]++++++++++.[[-]<]]<]

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Да нет, Женя. Просто потом этой ссылкой можно будет в пьяную морду тыкать! ;))

----

2Брукли: ну не нужно мне разминать мозги для этого. Всё проще. У меня есть некая работа по починке некоего агрегата (в моем любимом автобусе), а в голове решение так и не складывается... вот я прокрастинирую... в надежде, что решение меня найдет. То есть я сижу в мастерской и думаю, а чтобы скоротать врмея - вот снял ролик про паяльную пасту, теперь вот таймер этот... Пока решение со своей печкой не найду - обращайтесь! Прокрастинация - она такая!

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Имхо - однохренственно.

А что с печкой ?

Много пасты кладешь. Да и жидкая она у тебя какая то. Такую купил или разводил ?

-NMi-
Offline
Зарегистрирован: 20.08.2018

Дракуле надо памятнег саарудить, при жизни, из фарсунок комонрыльных. За саветы его, ниипические.