Ярослав Маляренко, а вообще несколько
if (flag_X)
{
тут что-то делаем, если надо вводим доп. флаги или даже конструкцию switch, если задачу надо раздробить
flag_X = 0 //сброс флага
}
В основном цикле while(1) крутим множество таких "задач", которые видят, что флаг не взведен и продолжают выполнение основной программы.
Также делаем таймер, который будет, например раз в миллисекунду давать прерывание (в stm32 для этого можно использовать systick, например).
Делаем глобальную переменную (например, volatile uint32_t motor_count = 36000), которая будет считать время работы двигателя, а в прерывании будем постоянно ее уменьшать. Как только в очередном прерывании она станет равна нулю, то взводим флаг, что надо изменить состояние двигателя.
Через несколько тактов мы попадем в свой if отвечающий за двигатель. Включим/выключим его, установим новое значение для переменной таймера, сбросим флаг и выйдем из if'а.
После чего продолжается постоянное выполнение основного цикла, пока опять не взведется один из флагов.
showtime13, если заземления нет, то его и не обнаружить.
В идеале объединить земли, но, если у вас не знаний, то это будет проблематично.
Если все корпуса металлические, то убедитесь что питание идёт с одной фазы (для вас м.б. проще с одной розетки просто запитать) и можно попробовать соединить корпус пк и корпус усилителя проводом.
Попробуйте с китая изолятор на usb взять, он развяжет вас от земли ПК. Название микрухи
Сверху бросал, правда там если только юсб 2.0.
Фокс Йовович, ну ардуино уже тоже на 32 битные МК лезет от всех подряд производителей. По поводу багов есть такое, но сам факт, что они пытаются как-то двигаться вперед виден.
Просто ответ был на комментарий именно о "хайпе", а не о подводных камнях в виде Errata и багов IDE и библиотек.
hint000, я бы не сказал, что молча.
Если студентов обучать на определенном железе, то с высокой вероятностью они будут стремиться поставить это железо в свои будущие разработки. Просто не все, возможно, это еще начали агрессивно делать.
Плюс вопрос доступности. Раньше можно было купить только AVR, соответственно полно людей, которые их программируют. Сейчас ST довольно активно продвигается, плюс цены относительно невысоки, программатор не требует от вас делать повышающие преобразователи до 13В и вообще стоит 1.5 бакса, ST предоставляют бесплатные среды разработки и т.д., соответственно туда начинают идти.
Если бы они еще на вопросы, как Texas Instruments отвечали...
Romiro27, ну статью не дам. Но можете поискать образовательные фильмы про работу трансформаторов, асинхронных двигателей. Там, думаю, научно-популярный ответ найдете.
Kalombyr, учитывая дискретность измерений в 12.8 мА предлагаю увеличить шунт до 0.1 - 0.4 Ом, тогда можно будет пересчитать калибровочные коэф. и получить хоть какую-то точность без залезания в статистику.
Manmipt, диоды одновременно мигают? Тогда вообще один канал ШИМ.
Ну типа такого:
по умолчанию все мигает с какими-то предустановками, есть счетчик MenuCnt = 0
зажали кнопки 1 и 2, потом кнопку 3 для подтверждения (зачем вообще тут 3 кнопки, когда одной хватит?)
отпустили кнопки.
увеличили MenuCnt до 1.
Если MenuCnt == 1, то включаем диоды без мигания и нажатиями кнопок 1 или 2 увеличиваем или уменьшаем коэф. заполнения ШИМ, настраивая яркость.
Зажав кнопки 1 и 2 и нажав кнопку 3 для подтверждения еще раз увеличиваем счетчик MenuCnt до 2.
Если MenuCnt == 2, то мигаем светодиодами устанавливая им коэф заполнения либо 0, либо заданный в предыдущем меню. Кнопками 1 и 2 меняем время между сменой состояний коэф. заполнения ШИМ.
Зажав кнопки 1 и 2 и нажав кнопку 3 для подтверждения обнуляем счетчик MenuCnt и схема будет работать в базовом режиме.
Хотя 3 кнопки на это перебор, ИМХО.
Отдельно стоит почитать про реализацию обработки кнопок и их дребезг (статей полно).
Мигание проще всего организовать еще одной переменной-счетчиком, по значению которого будет либо выдаваться ШИМ с заданным коэф. заполнения, либо с нулевым.
Вообще правильно поставленное задание отметет половину вопросов.
pfg21, скорее она должна быть соизмерима с периодами пульсаций. И как можно больше точек умещать в периоде. Если просто много выборок, но редко, то можем попадать в одни и те же точки на некоторых частотах.
По идее, встроенное усреднение датчика тока должно помочь. 128 выборок за ~67 мс.
Pavel K, получим разброс дурной из-за того, что можем ловить иголки и помехи.
Лучший вариант медианный фильтр. Берем, допустим 21 выборку, сортируем по возрастанию и берем 11-е значение.
При этом мы отсеиваем выбросы, которые как раз могут вносить серьезные ошибки.
Но тут вопрос в том, что эта выборка должна укладываться в период пульсаций. Иначе мы можем в теории всеми выборками поймать максимумы сигналов и получить завышенный результат.
if (flag_X)
{
тут что-то делаем, если надо вводим доп. флаги или даже конструкцию switch, если задачу надо раздробить
flag_X = 0 //сброс флага
}
В основном цикле while(1) крутим множество таких "задач", которые видят, что флаг не взведен и продолжают выполнение основной программы.
Также делаем таймер, который будет, например раз в миллисекунду давать прерывание (в stm32 для этого можно использовать systick, например).
Делаем глобальную переменную (например, volatile uint32_t motor_count = 36000), которая будет считать время работы двигателя, а в прерывании будем постоянно ее уменьшать. Как только в очередном прерывании она станет равна нулю, то взводим флаг, что надо изменить состояние двигателя.
Через несколько тактов мы попадем в свой if отвечающий за двигатель. Включим/выключим его, установим новое значение для переменной таймера, сбросим флаг и выйдем из if'а.
После чего продолжается постоянное выполнение основного цикла, пока опять не взведется один из флагов.