Alexeyslav Опубликовано 13 января, 2017 Поделиться Опубликовано 13 января, 2017 Вынести датчик вместе с частью электроники - преобразование аналоговой величины в цифровую произвести сразу на месте возле датчика по короткому проводку, сигнал пустить по RS-485 его легче изолировать. Для этого хватит 2-х парной витой пары. Главное правило защиты от грозовых разрядов - не должно быть на линии высокоомных нагрузок - именно на них и выпадает высокое напряжение во время грозового разряда и происходит неминуемый пробой. Впрочем, как показывает практика даже изоляция не помогает - практически после каждой грозы ходят и меняют свичи/перетыкают клиентов на оставшиеся рабочие порты. А там изоляция в принципе даже двойная, и на 5Кв рассчитана минимум. Повреждение потребителя на длинной линии во время грозы - это лишь вопрос времени, вероятности, и уровня защиты. Да, без защиты схема может работать десятилетиями - но это скорей огромное везение чем правило. Во время сиьных гроз возможны такие явления как шаровая молния - а она может пойти по вашему кабелю, поскольку с одного конца он заземлён, и даже если в кабеле есть заземляющий проводник(экран) он может оказаться первичной обмоткой трансформатора, по которому пойдёт ток и наведётся во всех сигнальных линиях. 1 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
Lerik-Co Опубликовано 15 января, 2017 Поделиться Опубликовано 15 января, 2017 (изменено) Спасибо за ваши ответы! Спрошу еще: на АТМега8 планирую повесить дисплей 5110, но подключать его шлейф буду только по мере необходимости для отладки и насторйки (естественно, предварительно обесточив МК). Так вот, когда дисплей будет не подключен, МК будет нормально работать с ногами висящими в воздухе, или их надо бы притянуть к какому-нть потенциалу резисторами? Изменено 15 января, 2017 пользователем Lerik-Co 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Lexter Опубликовано 15 января, 2017 Поделиться Опубликовано 15 января, 2017 1 час назад, Lerik-Co сказал: МК будет нормально работать с ногами висящими в воздухе, или их надо бы притянуть к какому-нть потенциалу резисторами? Выходы - не надо. Входы - резисторами по 50 - 100 кОм. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Lerik-Co Опубликовано 15 января, 2017 Поделиться Опубликовано 15 января, 2017 2 часа назад, Lexter сказал: Входы - резисторами по 50 - 100 кОм. А к плюсу или к минусу? Или это от схемы подключения зависит? А 10 кОм разве мало будет? Я именно такой номинал на входы планировал... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lerik-Co Опубликовано 15 января, 2017 Поделиться Опубликовано 15 января, 2017 Друзья, по моему скромному разумению такой код должен установить таймер на 10 мс. //ATMega8A #define F_CPU 4000000 //Частота МК=4МГц ... ISR(TIMER2_COMP_vect) { PORTD^=(1<<PORTD0); } int main(void) { Init(); //Настраиваем порты на вход/выход //Таймер TC2 на t=0,010 секунд (10 мс) TIMSK|=(1<<OCIE2); //OCIE2 - Флаг разрешения прерывания по совпадению Т2 TCCR2|=(1<<CS22) | (1<<CS21) | (0<<CS20); //делитель 256 TCNT2=0x00;//Регистр счета обнуляем (считать начинаем с нуля) OCR2=0x9C;//Считаем до 156 ( t[c] * F_CPU[Гц] / <делитель> = 0,01 * 4000000 / 256 = 156 = 0x9C ) sei(); while (1) { } } Однако на выходе получаю инверсию сигнала каждые 16,3 мс: 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lerik-Co Опубликовано 15 января, 2017 Поделиться Опубликовано 15 января, 2017 Я пропустил TCCR2|=(1<<WGM21)|(0<<WGM20) ? Т.е. режим надо сделать не Normal, а CTC? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 15 января, 2017 Поделиться Опубликовано 15 января, 2017 (изменено) Нужно ещё установить бит TCCR2 |= (1 << WGM21); Изменено 15 января, 2017 пользователем Yurkin2015 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lerik-Co Опубликовано 15 января, 2017 Поделиться Опубликовано 15 января, 2017 (изменено) Похоже на правду. Т.е. в моем случае он от 0 досчитывал до 156, вызывал прерывание по сравнению и продолжал считать дальше со 157 до 255? И только потом опять начинал с нуля? Так? Изменено 15 января, 2017 пользователем Lerik-Co 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 15 января, 2017 Поделиться Опубликовано 15 января, 2017 Так. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexter Опубликовано 15 января, 2017 Поделиться Опубликовано 15 января, 2017 8 часов назад, Lerik-Co сказал: А 10 кОм разве мало будет? Я именно такой номинал на входы планировал... Если то, что вы будете подключать к этому входу, может работать на нагрузку 10 кОм и отдавать "лишние" 0,5 мА, - ставьте 10 кОм. А на "+" или на "GND" зависит от того, какой уровень предусмотрен в программе при неподключённом входе. Если не важно - то и без разницы, куда "подтягивать". 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lerik-Co Опубликовано 16 января, 2017 Поделиться Опубликовано 16 января, 2017 (изменено) А что означает надпись в Протеусе: "CPU load 100%" ? О каком процессоре идет речь? Изменено 16 января, 2017 пользователем Lerik-Co 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 16 января, 2017 Поделиться Опубликовано 16 января, 2017 2 часа назад, Lerik-Co сказал: О каком процессоре идет речь? О компьютерном. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lerik-Co Опубликовано 17 января, 2017 Поделиться Опубликовано 17 января, 2017 11 час назад, Alex сказал: О компьютерном. Вряд ли, т.к. ни процессор в целом, ни одно из его ядер при этом и близко не нагружено на 100%. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alexeyslav Опубликовано 17 января, 2017 Поделиться Опубликовано 17 января, 2017 Диспетчер задач врёт, у него поядерный подсчет загрузки очень неточен. Протеус не умеет нагружать все ядра, вот он тебе и грузит только одно ядро на 100% а это не более 25% для 4-х ядерного. 1 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
Lerik-Co Опубликовано 17 января, 2017 Поделиться Опубликовано 17 января, 2017 (изменено) Alex, Alexeyslav, понятно. Значит на это значение можно не обращать внимание? На работу МК это не повлияет? Или уже пора что-то оптимизировать в прошивке? Изменено 17 января, 2017 пользователем Lerik-Co 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alexeyslav Опубликовано 17 января, 2017 Поделиться Опубликовано 17 января, 2017 МК всегда работает на 100% даже когда выполняет инструкцию NOP. 1 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 17 января, 2017 Поделиться Опубликовано 17 января, 2017 Разве что КПД проца в такой ситуации стремиться к нулю 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
ARV Опубликовано 17 января, 2017 Поделиться Опубликовано 17 января, 2017 Загрузка процессора 100% в протеусе говорит лишь о том, что протеус не способен симулировать в реальном масштабе времени. То есть за время между тактами микроконтроллера он не успевает просчитать состояние всех цепей. Поэтому реальные секунды начинают заметно опережать виртуальные: одна виртуальная секунда длится несколько настоящих секунд. 1 Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют... Ссылка на комментарий Поделиться на другие сайты Поделиться
Lerik-Co Опубликовано 17 января, 2017 Поделиться Опубликовано 17 января, 2017 (изменено) Понятно. А вот такая ситуация: между отключением и последующим включением полезной нагрузки должно пройти не менее 2 секунд. Как это реализовать? Я сделал так: unsigned char uchPause=0;//Объявил флаг и сбросил его ... //Во время отключения нагрузки выставил флаг: uchPause=1; ... //В таймере каждые 10 мс проверяю этот флаг и если он выставлен, начинаю увеличивать его на единицу, пока не насчитаю до 200. //Когда насчитал - сбрасываю его. if(uchPause>0) { uchPause++; if(uchPause>=200) { uchPause=0; } } ... //В функции включения нагрузки проверяю этот флаг и не включаю нагрузку, если он выставлен. Или это велосипед, и можно сделать проще? Есть тут что-нибудь для работы со временем, кроме таймеров? Изменено 17 января, 2017 пользователем Lerik-Co 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 17 января, 2017 Поделиться Опубликовано 17 января, 2017 12 минуты назад, Lerik-Co сказал: Есть тут что-нибудь для работы со временем, кроме таймеров? Есть, но таймеры - самый нормальный вариант. 12 минуты назад, Lerik-Co сказал: //Во время отключения нагрузки выставил флаг:uchPause=1; ... //В таймере каждые 10 мс проверяю этот флаг и если он выставлен, начинаю увеличивать его на единицу, пока не насчитаю до 200. Лучше не в единицу устанавливайте, а сразу задавайте время отсчёта uchPause=200; А в таймере его уменьшайте, если он больше нуля. Как дойдёт до нуля - отсчитал. if(uchPause && !--uchPause){ // Время прошло } 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lerik-Co Опубликовано 17 января, 2017 Поделиться Опубликовано 17 января, 2017 Alex, красиво. Подскажите еще, тут есть какая-нть директива вроде: #if (_DEBUG) //Какой-то код #endif Т.е. как определить, билдится дебаг или релиз? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ARV Опубликовано 17 января, 2017 Поделиться Опубликовано 17 января, 2017 я бы писал так #if defined(DEBUG) // some code #endif И в дебажной сборке определял бы глобальный макрос DEBUG. Для GCC это делается опцией -D: 1 Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют... Ссылка на комментарий Поделиться на другие сайты Поделиться
Dim-k12 Опубликовано 19 января, 2017 Поделиться Опубликовано 19 января, 2017 (изменено) Приветствую форумчан! Только начинаю осваивать программирование МК. Есть затея написать прошивку для регулятора напряжения автомобильного генератора. На данный момент написан код проверки напряжения бортсети по входу РВ2 и в соответствии с измеренным ацп значением подается ток в обмотку ротора по выходу РВ0, а также зажигания аварийной лампы на панели приборов при аварийном снижении и превышении напряжения. В протеусе проект работает. Использовал в программе прерывание ADC Conversion Complete, после завершения замера ацп дает прерывание, в программе измеренное значение сравнивается и совершает действие, затем выходит из прерывания ожидая следующего. И так постоянно. Теперь мучаюсь с доработкой программы для введения функции контроля включения зажигания, мк должен проснуться и начать следить за я раскручиванием ротора, используется переменка со статорной обмотки, а после раскручивания от заведенного двигателя уже начинать подавать ток возбуждения на ротор. Т.е как лучше реализовать контроль наличия переменки, внутри уже действующего прерывания или писать код на прерывание изменения сигнала на ноге? .include "tn13def.inc" .def TEMP = r16 .def rab=r17 .def schet=r18 ;в этом регистре записываем значение измеренного напряжения .cseg ;вектора прерываний .org 0 ;Задание нулевого адреса старта программы rjmp reset ;Безусловный переход к метке reset .org 9 ;Задание адреса прерывания по окоФнчанию преобразования АЦП rjmp ADC_complete ;Безусловный переход к метке ADC_complete reset: ;Начало раздела инициализации контроллера ldi TEMP, RAMEND ;Загрузка в регистр r16 адреса верхней границы ОЗУ out SPL, TEMP ;Копирование значения из r16 в регистр указателя стека SPL ldi TEMP, 0b00000001 ;Загрузка в r16 единицS в пятый бит out DDRB, TEMP ;Переключение вывода PB0 на выход ldi TEMP, 0b00000000;Загрузка в r16 out PORTB, TEMP ;Отключение обмотки возб. ldi TEMP, (1<<adlar)|(1<<mux0);подтяжка влево, вход измерения адс1. out ADMUX, TEMP ;Копирование из r16 в ADMUX ldi TEMP, (1<<aden)|(1<<adsc)|(1<<adate)|(1<<adie)|(1<<adps2)|(1<<adps1)|(1<<adps0);См.опис. делитель на 128 out ADCSRA, TEMP ;Копирование из r16 в ADCSRA sei ;Глобальное разрешение прерываний main: ;Основной цикл программы rjmp main ;Конец основного цикла программы ;Начало обработчика прерывания от АЦП ADC_complete: cli;запретить прерывания от АЦП in rab, ADCL ;считываем в регистр rab результат преобразования изм напряж из регистра адцл просто чтобы было, использовать эти данные не будем. in schet, ADCH ;Копирование в регистр schet результата преобразования из рег адцН эти данные будем сравнивать с заданными. cpi schet, 150 ;сравнение регистра адсН с константой 150 это примерно 2,94в на ноге РВ2 brlo ROTOR_ON ; перейти в подпрогр включения возб если адсН меньше 150 z2: cpi schet, 155 ;сравнить адцН с константой 155 , 5 это гистерезис 0,1в, можно его убрать. brsh ROTOR_off ; если адсН равно или бльше 155 то отключить обмотку возбуждения z3: ;выполнили прогу прерывания снова устанавливаем ацп, запускаем конвертацию и резрешаем прерывание, затем выход. ldi TEMP, (1<<adlar)|(1<<mux0) ;подтяжка влево, вход измерения адс1. out ADMUX, TEMP ;Копирование из r16 в ADMUX ldi TEMP, (1<<aden)|(1<<adsc)|(1<<adate)|(1<<adie)|(1<<adps2)|(1<<adps1)|(1<<adps0) ;См.опис. делитель на 128 out ADCSRA, TEMP ;Копирование из r16 в ADCSRA sei ;Глобальное разрешение прерываний reti ; выходим из обработки прерывания ROTOR_ON: push TEMP ldi TEMP, 0b00000001;Загрузка в r16 out PORTB, TEMP ;Включение обмотки возб. pop TEMP rjmp z2 ROTOR_off:push TEMP ldi TEMP, 0b00000000;Загрузка в r16 out PORTB, TEMP ;Отключение обмотки возб. pop TEMP rjmp z3 Изменено 19 января, 2017 пользователем Dim-k12 добавил код 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alexeyslav Опубликовано 19 января, 2017 Поделиться Опубликовано 19 января, 2017 Ох граблей насобираете.... чем данная разработка лучше линейного регулятора? Надёжность под вопросом... что будет если контроллер подвиснет в момент когда транзистор окажется открыт? Да, и код надо вставлять в соответствующий блок. 0 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
Lerik-Co Опубликовано 20 января, 2017 Поделиться Опубликовано 20 января, 2017 (изменено) 7 часов назад, Alexeyslav сказал: Надёжность под вопросом... что будет если контроллер подвиснет в момент когда транзистор окажется открыт? Можно поставить второй МК, который будет следить за самочувствием первого и ресетить его в случае необходимости. Кстати, а насколько "надежны" такие наши "бытовые" МК? Изменено 20 января, 2017 пользователем Lerik-Co 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.