Пожалуйста помогите чайнику с Binary Angle Modulation

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Пожалуйста помогите чайнику с Binary Angle Modulation

Сообщение COKPOWEHEU »

При хорошей абстракции да, но в поиске компромисса между качеством кода и скоростью его выполнения приоритет в данной задаче скорее а скорости. Ну и сам алгоритм перевода из числа в код для ВАМа может быть достаточно сложным для переписывания разрядности или количества выходов.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Пожалуйста помогите чайнику с Binary Angle Modulation

Сообщение СКАЗОЧНИК »

Оффтоп:
YS писал(а): идеале стоит придерживаться принципа разграничения уровней абстракции.
Ys, в очередной раз читаю ваш журнал (если можно так правильно сказать) и натыкаюсь на кучу интересных статей. Нравится стиль изложения, доходчивость, оригинальность. Не планируете ли для начинающих уроки по СТМ32?
Станислав
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Пожалуйста помогите чайнику с Binary Angle Modulation

Сообщение ARV »

я, конечно, не знаю, что и как делать правильно, но когда-то давно пробовал сделать BAM по-своему. вот пример для 32 каналов. при тактовой 16МГц частота BAM получается 55 Гц. в реальности не проверял (в протеусе только), но по теории мерцать не должно. никаких мер по борьбе со скачками яркости не предпринимал.

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr_helper.h>
#include <stdlib.h>

#define MAX_CH	32

typedef struct{
	volatile uint8_t *port;
	uint8_t pwm;
	uint8_t bitmask;
}chanel_t;

volatile chanel_t	chanel[MAX_CH];

static void init_chanels(void){
	uint8_t mask = 1;
	for(uint8_t i=0; i<MAX_CH; i++){
		chanel[i].bitmask = mask;
		if(i < 8)
			chanel[i].port = &PORTA;
		else if(i < 16)
			chanel[i].port = &PORTB;
		else if(i < 24)
			chanel[i].port = &PORTC;
		else
			chanel[i].port = &PORTD;
		chanel[i].pwm = 0;
		mask <<= 1;
		if(!mask) mask = 1;
	}
}

ISR(TIMER0_OVF_vect){
	static uint8_t mask = 1;

	mask <<= 1;
	if(!mask) mask = 1;

	for(uint8_t i=0; i< MAX_CH; i++){
		if(chanel[i].pwm & mask)
			*(chanel[i].port) |= chanel[i].bitmask;
		else
			*(chanel[i].port) &= ~chanel[i].bitmask;
	}
	TCNT0 = 255 - mask;
	//TIFR = _BV(TOIE0);
}

MAIN(){
	init_chanels();
	DDRA = DDRB = DDRC = DDRD = 255;

	OCR0 = 0x80;
	TCCR0 = TIMER_CLK_DIV_1024;
	TIMSK = _BV(TOIE0);
	sei();

	while(1){
		for(uint8_t i=0; i<MAX_CH; i++){
			chanel[i].pwm = rand();
		}
		_delay_ms(1800);
	}
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Пожалуйста помогите чайнику с Binary Angle Modulation

Сообщение YS »

И вообще, надо на Си переходить.
Ну, скорее не переходить, а добавлять его к арсеналу средств. :)

Вообще, честно говоря, на ассемблере я пишу крайне редко (а для x86 вообще никогда на нем не писал). Аккуратный код на Си при оптимизации, выставленной в -Os или -O3, обычно не уступает в скорости и компактности ассемблерному коду. Исключение - случаи, когда и правда надо считать машинные циклы. Так, я писал целиком на ассемблере модули (которые потом подключались к программе на Си) обмена по 1-Wire для AVR и, позже, для MSP430. А так вроде и все за последние годы... Ну если только не считать ситуаций, в которых требуется вставить одну-две инструкции, которые больше никак не вызвать - типа SLEEP в AVR (для работы с режимами сна в составе avr-libc, вообще, есть библиотека, но без нее код получается не слишком сложнее, зато компактнее). Там спасает одна строчка инлайнового ассемблера.
но в поиске компромисса между качеством кода и скоростью его выполнения приоритет в данной задаче скорее а скорости
Конечно, до классов с объектами, шаблонов и наследования доходить тут не надо, но в нашей задаче и без этого можно сделать вполне гибкий интерфейс с быстрой обработкой. :)

#pragma offtopic
читаю ваш журнал
Блог, штоле? :))
Нравится стиль изложения, доходчивость, оригинальность.
Спасибо, я рад, что старался не зря. :beer:
Не планируете ли для начинающих уроки по СТМ32?
Скорее всего нет. Тому есть несколько причин.

Первая и, наверное, основная - у меня сейчас очень мало времени, практически только на поспать. Как-то так внезапно оказалось, что нынче разработчики нужны буквально всем (кроме девушек). :))) В данный момент я веду четыре проекта и еще от двух отказался, потому что это просто выше моих сил. Я ощущаю, что и четыре для меня многовато, в будущем больше не буду брать столько. А еще я преподаю на вечерке, от дневных отказался, потому что, опять же, просто не осилить.

Ну и про STM32 нынче не пишет только ленивый. Уроков, туториалов, инструментов и примеров кода просто навалом. Я не вполне уверен, стоит ли мне лезть в эту толпу... :)

Вообще, философски, я не вижу смысла в уроках по конкретной архитектуре - это путь Ардуино, и это путь неверный. Человек должен

а) понимать, как вообще устроены контроллеры;
б) иметь навыки декомпозиции задачи и алгоритмизации (навыки программирования);
в) знать схемотехнику.

Если выполняются эти три условия, то человек может взять документацию, прочесть ее, и через неделю он уже будет доделывать устройство на новом МК и/или дописывать программу на другом языке (в рамках той же парадигмы). Да, разумеется, человек должен знать английский. Без этого выше дилетанта в наши дни в электронике не подняться, так что это условие само собой разумеющееся. Я его даже не включаю в перечисление.

Чтобы понимать, как устроены контроллеры, достаточно рассмотреть какую-нибудь простую архитектуру, где обилие наворотов не слишком отвлекает от основной структуры. AVR - хорошая модельная архитектура. MSP430 - тоже. Сразу бросаться на STM32 новичкам я никогда не посоветую.

Приобрести навыки программирования можно экспериментируя на "большом" компьютере.

Ну а со схемотехникой понятно. Минимум для старта - любой учебник по ТОЭ, Хоровиц и Хилл, Linear Circuit Design Handbook.

Так я считаю сам, и так я учу своих студентов.

Так что те же AVR хороши постольку, поскольку это удобная модельная архитектура. Переход с AVR на STM32 заключается по большей части в чтении документации.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Пожалуйста помогите чайнику с Binary Angle Modulation

Сообщение СКАЗОЧНИК »

Примерно так все и подозреваю. Просто с AVR уже давно ковыряюсь. Пусть не далеко ушел, зато практически основательно. Сильно убивает тот факт, что у меня не профильное образование и до всего приходится доходить самому (с огромными пробелами в физике, математике и т.д.). :facepalm:
Большей частью мои "разработки" - это игрушки: всяческие "свистоперделки". :))) Но людям, порой, больше и не надо (так и Ди-Халт сказал). Даже малость денег получается на этом заработать, что для непрофессионала считаю очень даже хорошо.

А иной раз, что бы что-то понять, начинаю читать в этой области все подряд и много, потом постепенно складываться мозаика начинает. Времени на это много уходит, а иной раз и интерес пропадает, тогда все... пиши - пропала. А еще бывает, что из всего подряд больше запутываешься, особенно если кто-то навключает туда кучу формул с интегралами.. :facepalm: , а на самом деле, там раз плюнуть было, если объяснить нормально и с другого конца. :)

Простите за оффтопы в тематических разделах, захотелось выговориться.

З.Ы. Также увидел, что вы где-то работаете (или работали) на предприятии по разработке ОПС. Давно интересует вопрос (если, конечно, это не секретная информация), где можно почитать и изучить принцип действия ППКОП? В частности входы для пожарных извещателей и принцип обработки. Понимаю, что там АЦП мониторит... подробностей хочется. :)
Станислав
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Пожалуйста помогите чайнику с Binary Angle Modulation

Сообщение YS »

Сильно убивает тот факт, что у меня не профильное образование и до всего приходится доходить самому (с огромными пробелами в физике, математике и т.д.).
А вы не убивайтесь. Большинству из тех, у кого профильное образование, это самое образование на пользу не пошло. Так что профильность образования - очень размытый критерий, по которому ориентироваться никак нельзя...

Вот из ваших рук выходят вполне рабочие устройства. А 90% тех, кто отучился по профилю, вообще не могут спроектировать ничего даже отдаленно рабочего. Это я из опыта говорю.
А еще бывает, что из всего подряд больше запутываешься, особенно если кто-то навключает туда кучу формул с интегралами..
Да-да, так очень любят делать люди с профильным образованием. Особенно те самые, которые ничего рабочего спроектировать не могут, но зато отучились на отлично, а то и аспирантуру закончили. Я на кафедре встречал людей, которые органически неспособны воспринимать мир никак иначе, кроме как через формулы с привлечением нормальных эллиптических интегралов третьего рода. :)))

Слава богу, среди моих учителей было гораздо больше нормальных преподавателей, которые способны объяснить суть явления.
Также увидел, что вы где-то работаете (или работали) на предприятии по разработке ОПС.
Да, работал три года назад.
где можно почитать и изучить принцип действия ППКОП?
Хм. Типа такого? Там в руководстве все описано.
Спойлер...

Прибор контролирует состояния ШС по их сопротивлению.
Для ШС охранной и тревожной сигнализации:
- сопротивление в пределах от 4 до 7 кОм – состояние "Норма";
- сопротивление 10 кОм и более или 2,8 кОм и менее – состояние "На-рушение".
Для ШС пожарной сигнализации, запрограммированных на прием из-вещений от активных извещателей или извещателей с нормально разомкнутой выходной цепью:
- сопротивление в пределах от 4 до 7 кОм – состояние "Норма";
- сопротивление от 1,0 до 2,8 кОм – состояние "Пожар";
- сопротивление 10 кОм и более или 220 Ом и менее – состояние "Не-исправность".
Для ШС пожарной сигнализации, запрограммированных на прием из-вещений от извещателей с нормально замкнутой выходной цепью:
СПНК.425513.024 РЭ 5 ППКОП "Нота-2"
- сопротивление в пределах от 1,0 до 2,8 кОм – состояние "Норма";
- сопротивление от 4 до 7 кОм – состояние "Пожар";
- сопротивление 10 кОм и более или 220 Ом и менее – состояние "Не-исправность".
2.4 Прибор регистрирует нарушение ШС на время 500 мс и более, и со-хранять состояние "Норма" при нарушении ШС на время 300 мс и менее, либо 70 мс и 50 мс соответственно (для ШС тревожной сигнализации).
2.5 Прибор передает на ПЦН извещение "Норма" замкнутым состояни-ем контактов выходного реле, с допустимыми коммутируемыми током не ме-нее 30 мА и напряжением не менее 72 В.

...
Таки да, АЦП, делители, масштабирующие усилители/буферы, если надо. Ну можно еще в софте фильтр от помех реализовать. Как-то так. Или что-то другое интересует?
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Пожалуйста помогите чайнику с Binary Angle Modulation

Сообщение СКАЗОЧНИК »

Просто, порой в ППКОП пишут, что он реагирует при сработке дымового извещателя увеличением тока в цепи извещателей, а второй сработавший еще его увеличивает, следовательно прибор определяет увеличение тока в цепи. Так написано. Но логика-то не та... :dont_know: Точнее та, но маленько по другому. Я же понимаю, что микроконтроллер в приборе не может измерить ток... Он мерит с помощью АЦП напряжение. А где мерит? Значит по выходам стоят делители из резисторов, или шунты. Так оно и есть в итоге, где увеличение тока в цепи вызывает увеличение падения напряжения на резисторе?
Еще там элементы защиты стоять должны.
А еще программная реализация вот этих самых диапазонов и задержек.
А еще, как я понимаю, прибор не способен опрашивать сразу все входы? Он их опрашивает по очереди с какой-то определенной дискретностью. Значит в каждый момент времени вход сигналки отключен?
Т.е. если я "теоретически" :))) соберу устройство с большим входным сопротивлением и подключу параллельно всем цепям прибора (или даже в один конкретный шлейф), то смогу с помощью МК или компа отследить период опроса, и в период паузы отрезать этот шлейф от датчиков и повесить на него оконечное сопротивление? Т.е. прибор будет видеть что все в порядке, а шлейф работать уже не будет? :)))
Это я так просто спрашиваю. Банк грабить я пока не собирался.
Станислав
MOHCTEP
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

Re: Пожалуйста помогите чайнику с Binary Angle Modulation

Сообщение MOHCTEP »

ARV, спасибо за ваш вариант! :beer: Он вполне хорош, но! Но использует основное преимущество ВАМа(сравнительно с софтовым ШИМом) - включение по маске. Такое решение потребует дополнительных буферных схем, чтобы разгрузить контроллер.
И опять же, вы используете предделитель аж на 1024. Почему?
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Пожалуйста помогите чайнику с Binary Angle Modulation

Сообщение YS »

А где мерит? Значит по выходам стоят делители из резисторов, или шунты. Так оно и есть в итоге, где увеличение тока в цепи вызывает увеличение падения напряжения на резисторе?
Ну, другие методы измерения тока, кроме как с преобразованием оного в напряжение, используются крайне редко. :) В итоге примерно так оно и есть, да; ничего волшебного. Конкретных схем я уже не помню, но идея такая, разумеется. Тем более, что это не прецизионный наноамперметр, а простой индикатор с достаточно широкими диапазонами реакции.
Еще там элементы защиты стоять должны.
Да, разумеется.
А еще программная реализация вот этих самых диапазонов и задержек.
Да. Но это не декодирование сжатого видеопотока, все сводится к нескольким if'ам. :) Ну и может быть там еще есть простенький цифровой фильтр, чтобы убрать помехи, как я уже говорил. Но я все же сомневаюсь, что в этом приборе его используют...
А еще, как я понимаю, прибор не способен опрашивать сразу все входы? Он их опрашивает по очереди с какой-то определенной дискретностью.
Да.
Т.е. если я "теоретически" :))) соберу устройство с большим входным сопротивлением и подключу параллельно всем цепям прибора (или даже в один конкретный шлейф), то смогу с помощью МК или компа отследить период опроса
Нет. Как вы его отслеживать будете? :) Переключается только вход АЦП, ну или, в зависимости от задачи, вход усилителя. Все остальные цепи выполняются по числу каналов и всегда подключены к ним. Вклад собственно измерительной цепи в мощность, потребляемую измерительным входом, крайне незначителен, потому отследить его фактически невозможно.
и в период паузы отрезать этот шлейф от датчиков и повесить на него оконечное сопротивление?
Период опроса мал. Частота опроса составляет сотни Герц, если не килогерцы. Надежно коммутировать многометровый шлейф с такой скоростью вряд ли удастся... Наличие емкости системы приведет к тому, что на линии в итоге будет что-то непонятное. Да и прибор контролирует обрыв... Контролировать обрыв вполне можно и асинхронно.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Пожалуйста помогите чайнику с Binary Angle Modulation

Сообщение ARV »

MOHCTEP писал(а):ARV, спасибо за ваш вариант! :beer: Он вполне хорош, но! Но использует основное преимущество ВАМа(сравнительно с софтовым ШИМом) - включение по маске. Такое решение потребует дополнительных буферных схем, чтобы разгрузить контроллер.
И опять же, вы используете предделитель аж на 1024. Почему?
Это очень старый код. Там по-моему даже 7-битный ШИМ, т.е. ВАМ. А делитель, кажется потому такой, что иначе обработчик прерываний не успевал отработать, он же на Си написан и с указателями. При меньшем числе каналов можно и частоту поднять. В общем, я сильно не старался оптимизировать...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
MOHCTEP
Опытный кот
Сообщения: 768
Зарегистрирован: Вс янв 19, 2014 00:55:09

Re: Пожалуйста помогите чайнику с Binary Angle Modulation

Сообщение MOHCTEP »

Понял. Спасибо! :)
Ответить

Вернуться в «AVR»