Подключение вентиляторов 12V 1.8A (4 wire)

Тема в разделе "Силовая электроника", создана пользователем MaXi, 3 сен 2017.

  1. Mifodiay

    Mifodiay Нуб

    ШИМ с частотой 25КГц
     
  2. asam

    asam Гик

    Ну я не пробовал, но согласно даташиту

    Ставим в TCCRnB no prescaler (CSn2 =0 CSn1 =0 CSn0 = 1)
    Ставим mode 15 (FAST PWM / ICRn)
    В ICRn пишем 639 (25КГц)
    А в соответсвующий OCRnx пишем значение ШИМ (0-639)

    Как-то так
     
  3. Mifodiay

    Mifodiay Нуб

    А можно попрасить как это будет выглядеть в коде. А то я действительно не въежаю. Как его написать.
     
  4. asam

    asam Гик

    Конкретный код будет зависeть от того на какой ноге нужен PWM.

    Посмотрите даташит, надеюсь разберетесь. А я спать пошел. Завтра вставать рано.
     
  5. Mifodiay

    Mifodiay Нуб

    У меня на D6 (MEGA)
     
  6. asam

    asam Гик

    D6 это РH3/OC4A значит вам нужен Timer 4. Дальше сами. Я спать. Пишите что смогли наваять. Утром посмотрю.
     
  7. Mifodiay

    Mifodiay Нуб

    спасибо
     
  8. parovoZZ

    parovoZZ Гуру

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

    parovoZZ Гуру

    Дам подсказку: чтобы получить 25 кГц с системной частоты 16 Мгц, таймер должен считать до 640.
     
  10. Mifodiay

    Mifodiay Нуб

    я же говорю что то с этим у меня туго, читаю ищу в инете. Но код простенький собрать трудновато.
     
  11. parovoZZ

    parovoZZ Гуру

    Есть прекрасная книжка Евстифеева про МК AVR. На сайте микрочипа целая кладезь апноутов на любые темы (на сайте microsin есть переводы).
    Я в своих записях здесь также касался темы настройки таймеров.
     
  12. a1000

    a1000 Гуру

    Что-бы получить ШИМ вручную надо разобраться с работой таймеров и их настройкой. Этот вопрос выходит далеко за пределы ардуино.
     
  13. Mifodiay

    Mifodiay Нуб

    Я это понимаю не дурак ведь , поэтому тут и пишу, а также пытаюсь что то сам почитать.
     
  14. a1000

    a1000 Гуру

    Если не хотите вникать в тонкости работы микроконтроллера, есть библиотека TimerOne. Если я не ошибаюсь, с ней и ШИМ можно генерировать.
     
  15. Mifodiay

    Mifodiay Нуб

    за ссылку на книжку, большое спасибо обезательно прочту, а пока я тут что то извоял, но наверное не правильно и не до конца это 100%. Подскажите как этот код оформить в что то рабочее. Как я уже писал с этим у меня пока плохо, так что прошу не ругаться
    Код (C++):
    const int burFan = 38; // вентилятор горелки
    const int pwmPin = 6;      // digital pin 6

    void setup() {
      Serial.begin(9600);
      pinMode(pwmPin, OUTPUT);   // sets the pin as output
      pinMode(burFan, OUTPUT);   // sets the pin as output
      pwm_initial();
    }

    void loop() {
        digitalWrite(burFan,HIGH);
     
    void pwm_initial() {  //Режим Fast PWM

       // DDRB |= 1 << 1; // PH1 как выход, канал 1
       
        TCCR4A = 0; // Сброс данных регистра
        TCCR4B = 0; // Сброс данных регистра
        TCNT4  = 0; // Установка нижнего предела

        TCCR4B |= (1 << CS10); // Работа без делителя Делитель= /1

        TCCR4A |= (1 << COM4A1) | (1 << COM4B1);  // Не инверсный режим работы
        ICR4    = 639;                            // 16 МГц / 1 * ( 1 + 639 ) = 25 кГц

        // Установка верхнего предела
        // значением в бите ICR1
        // Режим 15 из документации
        TCCR4A |= (1 << WGM10 | (1 << WGM11));
        TCCR4B |= (1 << WGM12) | (1 << WGM13);

        OCR4A = 639;  //  значение уровня 100%
        OCR4B = 0;  //  значение уровня 0%
       
    }
     
     
  16. parovoZZ

    parovoZZ Гуру

    Так заработало или нет?

    Без делителя таймер работать не будет). Чтобы таймер начал тикать, необходимо задать коэффициент деления системной тактовой частоты. Правильно писать
    Чтобы таймер остановить, коэффициент деления необходимо обнулить)
     
  17. Mifodiay

    Mifodiay Нуб

    нет не заработало
     
  18. asam

    asam Гик

    Меги сейчас под рукой нет. Опробовал на Uno. Там TImer1 почти такой же как и все 16 разрядные таймеры на меге
    Код (C++):
    //25 KHZ PWM on OC1A (PB1) - Arduino NANO/UNO D9 pin

    #define CNT 639   //25KHz if system clock is 16Mhz

    void setup() {

      DDRB |= (1 << DDB1); // PB1 as outpu

      TCCR1A  = (1 << COM1A1);// set none-inverting mode
      TCCR1A |= (1 << WGM11);
      TCCR1B  = (1 << WGM12) | (1 << WGM13); // set Fast PWM mode using ICR1 as TOP
      TIMSK1  = 0; //No interrupts
      ICR1 = CNT;    //Set required Frq
      TCCR1B |= (1 << CS10);   // START the timer with no prescaler
    }

    void SetDuty(uint16_t duty)
    {
      if (duty <= CNT)
      {
        OCR1A = duty;
      }
    }

    uint16_t duty = 0;

    void loop() {
      SetDuty(++duty);
      if (duty >= CNT) duty = 0;
      delay(20);
    }