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

Вопросы от начинающих по МК


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

Вынести датчик вместе с частью электроники - преобразование аналоговой величины в цифровую произвести сразу на месте возле датчика по короткому проводку, сигнал пустить по RS-485 его легче изолировать. Для этого хватит 2-х парной витой пары.

Главное правило защиты от грозовых разрядов - не должно быть на линии высокоомных нагрузок - именно на них и выпадает высокое напряжение во время грозового разряда и происходит неминуемый пробой.

Впрочем, как показывает практика даже изоляция не помогает - практически после каждой грозы ходят и меняют свичи/перетыкают клиентов на оставшиеся рабочие порты. А там изоляция в принципе даже двойная, и на 5Кв рассчитана минимум.

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

Учение - изучение правил. Опыт - изучение исключений.

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

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

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

Спасибо за ваши ответы! Спрошу еще:

на АТМега8 планирую повесить дисплей 5110, но подключать его шлейф буду только по мере необходимости для отладки и насторйки (естественно, предварительно обесточив МК).

Так вот, когда дисплей будет не подключен, МК будет нормально работать с ногами висящими в воздухе, или их надо бы притянуть к какому-нть потенциалу резисторами?

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

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

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

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

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

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

1 час назад, Lerik-Co сказал:

МК будет нормально работать с ногами висящими в воздухе, или их надо бы притянуть к какому-нть потенциалу резисторами?

Выходы - не надо. Входы - резисторами по 50 - 100 кОм.

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

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

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

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

2 часа назад, Lexter сказал:

Входы - резисторами по 50 - 100 кОм.

А к плюсу или к минусу? Или это от схемы подключения зависит?

А 10 кОм разве мало будет? Я именно такой номинал на входы планировал...

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

Друзья, по моему скромному разумению такой код должен установить таймер на 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 мс:

 

Снимок.JPG

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

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

Т.е. в моем случае он от 0 досчитывал до 156, вызывал прерывание по сравнению и продолжал считать дальше со 157 до 255? И только потом опять начинал с нуля?

Так?

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

8 часов назад, Lerik-Co сказал:

А 10 кОм разве мало будет? Я именно такой номинал на входы планировал...

Если то, что вы будете подключать к этому входу, может работать на нагрузку 10 кОм и отдавать "лишние" 0,5 мА, - ставьте 10 кОм. А на "+" или на "GND" зависит от того, какой уровень предусмотрен в программе при неподключённом входе. Если не важно - то и без разницы, куда "подтягивать".

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

Диспетчер задач врёт, у него поядерный подсчет загрузки очень неточен. Протеус не умеет нагружать все ядра, вот он тебе и грузит только одно ядро на 100% а это не более 25% для 4-х ядерного.

Учение - изучение правил. Опыт - изучение исключений.

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

Alex, Alexeyslav, понятно. Значит на это значение можно не обращать внимание? На работу МК это не повлияет?

Или уже пора что-то оптимизировать в прошивке?

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

Разве что КПД проца в такой ситуации стремиться к нулю :rolleyes:

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Загрузка процессора 100% в протеусе говорит лишь о том, что протеус не способен симулировать в реальном масштабе времени. То есть за время между тактами микроконтроллера он не успевает просчитать состояние всех цепей. Поэтому реальные секунды начинают заметно опережать виртуальные: одна виртуальная секунда длится несколько настоящих секунд.

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

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

Понятно. :)

А вот такая ситуация: между отключением и последующим включением полезной нагрузки должно пройти не менее 2 секунд.

Как это реализовать? Я сделал так:
 

unsigned char uchPause=0;//Объявил флаг и сбросил его

...

//Во время отключения нагрузки выставил флаг:
uchPause=1;

...
  
//В таймере каждые 10 мс проверяю этот флаг и если он выставлен, начинаю увеличивать его на единицу, пока не насчитаю до 200.
//Когда насчитал - сбрасываю его.
if(uchPause>0)
{
	uchPause++;
	if(uchPause>=200)
	{
		uchPause=0;
	}
}

...
  
//В функции включения нагрузки проверяю этот флаг и не включаю нагрузку, если он выставлен.

Или это велосипед, и можно сделать проще? Есть тут что-нибудь для работы со временем, кроме таймеров?

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

12 минуты назад, Lerik-Co сказал:

Есть тут что-нибудь для работы со временем, кроме таймеров?

Есть, но таймеры - самый нормальный вариант.
 

12 минуты назад, Lerik-Co сказал:

//Во время отключения нагрузки выставил флаг:
uchPause=1; ...
//В таймере каждые 10 мс проверяю этот флаг и если он выставлен, начинаю увеличивать его на единицу, пока не насчитаю до 200.

Лучше не в единицу устанавливайте, а сразу задавайте время отсчёта

uchPause=200;

А в таймере его уменьшайте, если он больше нуля. 
Как дойдёт до нуля - отсчитал.
 

if(uchPause && !--uchPause){
  // Время прошло
}

 

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

Alex, красиво. :)

Подскажите еще, тут есть какая-нть директива вроде:

#if (_DEBUG)
	//Какой-то код
#endif

Т.е. как определить, билдится дебаг или релиз?

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

я бы писал так

#if defined(DEBUG)
  // some code
#endif

И в дебажной сборке определял бы глобальный макрос DEBUG. Для GCC это делается опцией -D:

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

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

Приветствую форумчан!

Только начинаю осваивать программирование МК.

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

На данный момент написан код проверки напряжения бортсети по входу РВ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

 

схема подкл.jpg

схема рн.jpg

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

Ох граблей насобираете.... чем данная разработка лучше линейного регулятора? Надёжность под вопросом... что будет если контроллер подвиснет в момент когда транзистор окажется открыт?

Да, и код надо вставлять в соответствующий блок.

Учение - изучение правил. Опыт - изучение исключений.

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

7 часов назад, Alexeyslav сказал:

Надёжность под вопросом... что будет если контроллер подвиснет в момент когда транзистор окажется открыт?

Можно поставить второй МК, который будет следить за самочувствием первого и ресетить его в случае необходимости. :lol:

Кстати, а насколько "надежны" такие наши "бытовые" МК?

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

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...