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

Управление ШИМ по USART


-=FISHER=-

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

Всем привет!

Я уже ранее создавал тему (можно удалить ВОТ ЭТУ). Теперь вопрос немного изменился, как правильно изменять значения регистров аппаратной ШИМ (OCR1A и OCR1B МК AtMega8 через USART)? Делаю это в прерывании по приёму USART с помощью вот такого кода, который разделяет посылки на два канала ШИМ 0 (OCR1A) и 1 (OCR1B):

Скрытый текст

unsigned char state, pwmNum, pwmCount;

ISR(USART_RXC_vect)
{
		if(state == 0)
		{
			state =  1;
			pwmNum = UDR;
		}
		else if(state == 1)
		{
			state =  0;
			pwmCount=UDR;
			if(pwmNum == 0){OCR1A=pwmCount;}
			else if(pwmNum == 1){OCR1B=pwmCount;}
		}
}

 

USART инициализирован следующим образом:

Скрытый текст

void USART_ini(unsigned int speed)
{

	UBRRH = (unsigned char) (speed>>8);
	UBRRL = (unsigned char) speed;
	UCSRB = (1<<RXEN) | (1<<TXEN); //Включаем приём и передачу по USART
	UCSRB|= (1<<RXCIE); //разрешаем прерывания по приёму
	UCSRA|= (1<<U2X); //удвоение частоты
	UCSRC = (1<<URSEL) //Обращаемся именно к регистру UCSRC
			|(1<<USBS) //2 стоп-бита
			|(1<<UCSZ1)|(1<<UCSZ0); //длинна посылки 8 бит
}

USART_ini(8); //устанавливаю скорость 115200

 

PWM инициализирован следующим образом:

Скрытый текст

void pwm_ini (void) //инициализация 8 битного, одноканального ШИМ таймера
{
	TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
	TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS10) | (1 << CS10);
	TCNT1 = 0x00;
	ICR1 = 0xFF;
	OCR1A = 0x00;
	OCR1B = 0x00;
}

 

 

И всё вроде бы работает, но очень не стабильно и через раз. Что я делаю не правильно, подскажите пожалуйста.

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

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

27 минут назад, -=FISHER=- сказал:

который разделяет посылки на два канала ШИМ 0 (OCR1A) и 1 (OCR1B):

Делаете Вы неправильно. Нужно принимать всю строку по юарт. Первые 2-5 байт указатель на команду, за ними сразу 4 байта данных . 2 байта 1 канал ШИМ , следующие 2 байта 2 канал ШИМ.

Преобразовать int в 2 char можно так:

char int_to_char_lo(int data)
{
 return  (data & 0xFF);
}

char int_to_char_hi(int data)
{
 return  (data >> 8);
}

int char_to_int(char hi, char lo)
{
int buff;
buff=hi;
buff<<=8;
buff |= lo;
  return  buff;
}

// применение

void main(void)
{
int data=200;
init();

char data_hi, data_lo;
data_lo = int_to_char_lo(data);
data_hi = int_to_char_hi(data);
printf("HI=%d, LO=%d\r\n", data_hi, data_lo);
data = char_to_int(data_hi, data_lo);
printf("INT=%d\r\n", data);
while(1)
{

}
}

 

Вот тут есть полный проект , где через юарт сделан весь обмен:

https://drive.google.com/open?id=1EA38OiCkfXMlfqe6j6cNPnYsg1c5jFyQ

 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

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

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

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

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

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

10 часов назад, artos5 сказал:

Делаете Вы неправильно.

Хорошо, а если у меня только 1 канал ШИМ, и я просто передаю по UART байт данных который содержит значение регистра OCR1A в диапазоне 0-255 и сразу же в прерывании присваиваю это значение регистру OCR1A? Здесь всё правильно? Всё должно корректно работать?

ISR(USART_RXC_vect)
{
 	OCR1A = UDR;
}

 

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

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

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

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

Правильно , но если к примеру произойдет помеха на шине , может мусор вывести в ШИМ модуль .

Лучше использовать указатель на команду и если ответственное управление то защищать контрольной суммой .

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

12 минуты назад, artos5 сказал:

Правильно

Вроде как в даташите написано что OCR1A это 16 битный регистр, (точнее регистровая пара OCR1AL и OCR1AH), и значит может принимать значения от 0 до 65535. Разве в таком случае значение 255 будет устанавливать ШИМ в максимум?

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

Так можно программно понизить разрешение ШИМ , и оно станет 8ми битным.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

6 минут назад, artos5 сказал:

Так можно программно понизить разрешение ШИМ

Но фактически если я присваиваю значения от 0 до 255 сразу регистру OCR1A, то 0 это будет минимальная скважность, а 255 максимальная? Просто если идти плавно от 0 к 255, то получается как бы меньшая разрешающая способность?

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

@artos5 в общем видимо Вы очень правы на счёт:

1 час назад, artos5 сказал:

Лучше использовать указатель на команду и если ответственное управление то защищать контрольной суммой .

Сейчас пытаюсь освоить передачу команд со смартфона через Bluetooth на МК AtMega8, в частности управлять ШИМ как Вы наверное догадались)) И вот чтобы исключить вероятность глючности софта, передаю шестнадцатиричные команды со смартфона через программу Bluetooth Terminal на связку модуля HC-05 и USART-USB переходника FT232RL. И в итоге с заведомо исправным софтом у меня частенько прилетает какой-то мусор, вместо того байта что я отправил! Как это можно объяснить и самый главный вопрос как от этого избавиться?

image.png.2f0a1a2d2b8f8c4a1bafe36e2d5a8a00.png

Я 16 раз подряд отправил одну и ту же команду 0x7B (123 - в десятичной системе), и как видно 3 раза из 16 терминал принял ошибочные данные. А это почти 19% ошибок. Возможно ли с этим бороться только на стороне приёмника и как именно?

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

Изменено

9 часов назад, -=FISHER=- сказал:

Я 16 раз подряд отправил одну и ту же команду 0x7B (123 - в десятичной системе), и как видно 3 раза из 16 терминал принял ошибочные данные. А это почти 19% ошибок.

Проблема была в несоответствии скоростей. На модуле была скорость 38400, а в терминале на компьютере 115200. синхронизировал и ошибки ушли.

Мы все учились по-немногу, чему-нибудь и как-нибудь...

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

9 часов назад, -=FISHER=- сказал:

Как это можно объяснить и самый главный вопрос как от этого избавиться?

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

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Никогда не делайте передачу информации без "пакета". Вам все ведь равно, послать по блютузу 1 байт или 101, но в последнем случае информации больше.

Вы посылаете байт для ШИМа, а потом думаете, как его поместить в один из двух каналов. Разве кто-то запретил при отправке конкретно указывать, для какого канала этот байт? Что мешает отправить 2 байта: первый задаёт номер канала ШИМ, а второй - собственно значение скважности?

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

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

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

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

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

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

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

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

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

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

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

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

    • Это только по одному плечу? По второму плечу нормально?
    • а ответ на вопрос темы от Вас будет? Т.е. сохранится ли рабочая программа при разъединении верхней и нижней плат?  Потому как если ответ однозначно положительный, то этот геморрой с самопальным шнурком мне нафиг не нужен. 
    • Всем привет, комрады!  Пользуюсь данным усилителем чуть больше 13 лет, все устраивает. Питается от ТС-180-2. Понадобилось заменить этот трансформатор на другой поменьше, думаю на торе заказать, а какой именно по характеристикам - пытаюсь разобраться. Стыдно признаться, ни разу не смотрел какие напряжения, какие токи в усилителе... собрал - включил и забыл. Сейчас придется разбираться.  Правильно ли понимаю что общая мощность транса = токи и напряжения каждой лампы, + накалы?  Тогда судя по даташитам, 6н1п на два канала - (250в*0,0075мА)*2 + (6,3в*0,6А)=3,75Вт+ 3,8Вт=~7,5Вт.  А 6п14п=(250в*0,048А+250В*0,005А+6,3В*0,76А) * 2 = (12Вт+1,25Вт+4,8Вт ) * 2 лампы = 18Вт * 2  = 36Вт. Хотя две лампы 6п14п питаются от одной обмотки 6,3в.  Итого меньше 50 Вт, ну и с запасом небольшим 60-80Вт.  А вот как указать в заказе? Схема питается 275в, то есть вторичку делать 200в, а ток?  То есть две выходных лампы уже 100мА, запас если делать как правило 10-20%, то примерно 200в * 120мА ?  НУ с накалом тут проще) Задача в том что нужно как можно менее габаритный трансформатор, увы, ТС-180 не влезает в новую конструкцию. Ну и для понимания, сейчас начну усилитель для наушников собирать, пригодится.    
    • Лучше не надо.  Буфер добавляет всего 6 копеечных деталей а надëжность и мощность увеличит в разы, и даст работать даже с низкоомными наушниками. Даже 32 Ом наушники один ОУ из JRC4558 не потянет. 
    • Какова площадь поверхности данного радиатора?
    • @Богдан Назаренко , 4558 и 5532 на слух не отличить. Да и параметры у них практически одиннаковые. Мне показалось TL072 звучит хуже.
×
×
  • Создать...