ШИМ с 16кГц управляемый кнопками

Тема в разделе "Глядите, что я сделал", создана пользователем woow, 28 ноя 2013.

  1. woow

    woow Гик

    состряпал вот такой скеч, о как его проверить. Мне нужен ШИМ с 16кГц управляемый кнопками через меню. Кнопкой селект доходим до пункта Ventiliator а там уже с up/down повышаем или понижаем амплитуду. Понижается не до нуля а где то 70% чтобы не спалить движок. Оставил и мусора в скече, это от часов, они мне нужны в этом меню, только в теч местах где компилятор ругается вставил // (тормоза).
    Покритикуйте пожалуйста, а то не как проверить. Компилятор не ругается но это ещё не чего не значит.
    Если с кодом получется проведу стендовыэ испытание и выложу схему на IGBT для управления однофазным движком.

     
    Последнее редактирование: 2 дек 2013
  2. woow

    woow Гик

    Есть ли у кого мысли как из Ардуино УНО выжать 16кГц ШИМ? На сколько понимаю это не проблема знающему, но пока для меня изучения даташитов и образцов кода ясности не дало. Не имею понятия, как проверить хотя бы виртуально.
     
  3. Megakoteyka

    Megakoteyka Оракул Модератор

    http://roboforum.ru/wiki/AVR:ШИМ
     
  4. fr0ster

    fr0ster Гик

    Кратко, не использовать Ардуиновскую либу
     
  5. woow

    woow Гик

    тогда весь проект рушится. По тому что все составляющее на ардуиновском перебивать код на другой язык. Но как тогда здесь http://www.leonvanderhorst.nl/source_codes/Heemskerk_WorkShop_Test.pde они справились с этой проблемой? Извините, что я так преподношу примерами, но эти голландцы мне не ответили, в этом коде у них ШИМ на около 16кГц управляет двигателем по Н мостовой схеме
     
    Последнее редактирование: 4 дек 2013
  6. Megakoteyka

    Megakoteyka Оракул Модератор

    Язык один и тот же - C++. Нет никакого "ардуиновского" языка, забудьте эту ересь.
    Есть ардуиновская библиотека. Никто не мешает переписать настройку ШИМ без использования функций этой библиотеки. Остальное при этом трогать не обязательно.
     
  7. woow

    woow Гик

    имели в виду эту <avr/interrupt.h>?
     
  8. fr0ster

    fr0ster Гик

    Не только. Еще <avr/io.h> <avr/sleep.h> <util/delay.h>
     
  9. ИгорьК

    ИгорьК Гуру

    Чет вы запутали товарища woow, мне кажется.

    Ответ кратко должен быть таким, мне кажется.

    Чтобы использовать 16 кгц ШИМ, нужно напрямую установить несколько регистров микроконтроллера, которые отвечают за это. Такая операция возможна в среде Ардуино, как это сделано, например, в первом посте этой ветки в секции void setup.

    В дальнейшем, управление ШИМ будет также осуществляться путем прямой записи необходимых значений в регистры.

    А вот что такое регистры и как это делается - придется читать дополнительно.
     
  10. fr0ster

    fr0ster Гик

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

    ЗЫ А прерывания вообще отдельная песня.
     
  11. ИгорьК

    ИгорьК Гуру

    Я же не спорю. Только "отказ от ардуиновской либы" для начинающего звучит скорее всего непонятно.
    Тем более, если вопрос касается ШИМ, то и либы то никакой (на поверхности) нет.

    "отказ от ардуиновской либы" - это чего не делать. А делать то что?
     
  12. fr0ster

    fr0ster Гик

    Ну как что, отказ это неиспользование всяких analogWrite и digitalWrite.
    Отсюда у начинаещего должен возникнуть вопрос, а как пин дергать?
    И ответ появится после чтения даташитов и каких то курсов по МК АВР программингу типа от DiHalt/
    А дальше ответы породят новые вопросы и так до просветления.
     
  13. Megakoteyka

    Megakoteyka Оракул Модератор

    Начинающие думают, что ардуино программируется на "ардуиновском" языке и не понимают, где проходит граница между языком и библиотекой. Даташитов боятся как огня.
    Библиотека ардуины хороша тем, что позволяет делать простейшие вещи, не вникая в какие-либо тонкости, дает возможность почувствовать себя программистом практически каждому. Но этим же и плоха. Сильно ограничивает возможности своей универсальностью и сбивает новичков с толку. Так хорошо скрывает детали, что многие даже не представляют себе, что можно программировать как-то иначе.
    Нужно с этим что-то делать.
    Давно руки чешутся статью написать водную, пора уже этим заняться, видимо...
     
  14. fr0ster

    fr0ster Гик

    Да, давно пора назначать водную процедуру :)
    Нужно стимулировать чтение документации и пользование гуглом, иначе не выйдет наставить новичка на путь истинный. А скрытие деталей хорошо если от ардуины требуется что-то простое до нельзя и не более.
     
  15. ИгорьК

    ИгорьК Гуру

    Очень пора.
    Но простим начинающих - им не куда ткнуться. Ардуино тем и хороша, что все разложено по полочкам. А все что за пределами Ардуино по полочкам не разложено.
    У того же DiHalt вроде все хорошо, но перейти от ардуиновского С к ассемблеру DiHalt - задача вряд ли возможная.
    Мне все таки видится путь начинающего в постепенном переходе от родной IDE к Atmel Studio c visualmicro плагином и визардом от CodeVision.
    [​IMG]
    Более того - там вверху кнопочка - левее белой V на голубом фоне позволяет написать программу на чистом С++ и загрузить в Ардуино.
     
    Последнее редактирование: 5 дек 2013
  16. fr0ster

    fr0ster Гик

    У DiHalt`а ассемблер только на начальных уроках. Чтоб виднее было нутро МК, какие регистры и так далее.
    Потом на С идет обучение. А насчет ИДЕ, то у Ардуино есть ссылки на CodeBlocks заточенный под AVR и Arduino. Оно все же полегче, чем атмелстудия и лучше чем ардуиноиде
     
  17. ИгорьК

    ИгорьК Гуру

  18. fr0ster

    fr0ster Гик

    У меня она в столе лежит. Действительно неплохая, хотя привычка задавать регистры числами иногда путает, с прожогу неясно какие биты взвелись, без перевода шестнадцатиричных в двоичные.
     
  19. woow

    woow Гик

    ну вы тут ребятки и погнали хвастаться: кто мудрее и по круче, а я вот вообще не программист и им уже не стану. По скольку есть другая работа и этим творчеством занимаюсь после работы и то если есть на это время. Где то 25 лет назад встречался на ВУЗе с Basic пол семестра и зачёт получил, вот такой программист. В детстве паял всякие схемки из Радио журнала, кое что получалось. Но желание что то творить из электроники не когда не покидало меня. Вот и теперь элементная база пустяковая, а тут застрял в программировании. Если сравнивать что я понимал в сентябре и теперь - ого какой для меня прогресс...
    и так поиски продолжаются...
    этот код ШИМа работает, правда точно измерить нечем но примерно на осциллографе ловит 16кГц. Пробовал подключать LED и моторчик к 9пину- димирование есть (работает). Пошёл к второму этапу- управлять кнопками и тут полный тормоз и сам писал код и списывал, но результат тот же - диминг не работает, LED глохнет только совсем когда значение равно 0, а так полная мощь. На LCD все бегает, показывает, а на выходе не меняется.
     
    Последнее редактирование: 12 дек 2013
  20. fr0ster

    fr0ster Гик

    Код (Text):
    int ReadKey(int keyPin)
    {
    int KeyNum=0; int KeyValue1=0; int KeyValue2=0;
    do {KeyValue1=analogRead(keyPin); KeyValue2=analogRead(keyPin);}
    while (KeyValue1==KeyValue2&&KeyValue2!=1023);
    if (KeyValue2<ButtonUp_HIGH&&KeyValue2>ButtonUp_LOW) {KeyNum=1;}//Up
    if (KeyValue2<ButtonDown_HIGH&&KeyValue2>ButtonDown_LOW) {KeyNum=2;}//Down
    if (KeyValue2<ButtonLeft_HIGH&&KeyValue2>ButtonLeft_LOW) {KeyNum=3;}//Left
    if (KeyValue2<ButtonRight_HIGH&&KeyValue2>ButtonRight_LOW) {KeyNum=4;}//Right
    if (KeyValue2<ButtonSelect_HIGH&&KeyValue2>ButtonSelect_LOW) {KeyNum=5;}//Select
    return KeyNum;//graziname nuspausto mygtuko reiksme
    }
    "Хотелось бы в общих чертах, о чем интурист говорит"(С).
    Можете человеческим языком рассказать что вы хотите тут получить?
    У вас в зависимости от нажатой кнопки меняется напруга на пине и вы ее считав пытаетесь определить нажатую кнопку? Но зачем два цикла вначале? Дребезг давите?

    Попробуйте такой код
    Код (Text):
    int ReadKey(int keyPin)
    {
    int KeyNum=0; int KeyValue1=0; int KeyValue2=0;
    do {KeyValue1=analogRead(keyPin); KeyValue2=analogRead(keyPin);}
    while (KeyValue1==KeyValue2&&KeyValue2!=1023);
    if (KeyValue2<=ButtonUp_HIGH&&KeyValue2>ButtonUp_LOW) {KeyNum=1;}//Up
    if (KeyValue2<=ButtonDown_HIGH&&KeyValue2>ButtonDown_LOW) {KeyNum=2;}//Down
    if (KeyValue2<=ButtonLeft_HIGH&&KeyValue2>ButtonLeft_LOW) {KeyNum=3;}//Left
    if (KeyValue2<=ButtonRight_HIGH&&KeyValue2>ButtonRight_LOW) {KeyNum=4;}//Right
    if (KeyValue2<=ButtonSelect_HIGH&&KeyValue2>ButtonSelect_LOW) {KeyNum=5;}//Select
    return KeyNum;//graziname nuspausto mygtuko reiksme
    }