ШИМ, увеличение частоты

sirik
Offline
Зарегистрирован: 10.11.2012

Добрый день

Есть задачка управлять электронным редуктором воздуха через Arduino. Управляется он следующим образом: на вход подается напряжение от 0В до 5В. Подключил к А0, вывожу нужное напряжение через analogWrite.

Но проблемма в том, что частота, на котрой работает ШИМ Arduino слишком мала: редуктор как бы дрибижит на нужно давлении, вместо того, чтобы работать плавно, ну или "держать" его. Я так понимаю, что частота, на которой работает микроконтроллер редуктора выше чатоты ШИМа Arduino.

Может подсажите как частоту ШИМа можно поднять?

Спасибо

gena
Offline
Зарегистрирован: 04.11.2012

На помять не подскажу, но на сайте этот вопрос очень хорошо освещался. Воспользуйтесь поиском по сайту.

maksim
Offline
Зарегистрирован: 12.02.2012

Какая дуина? На каком пине analogWrite? 

axill
Offline
Зарегистрирован: 05.09.2011

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

Rednaxela
Offline
Зарегистрирован: 26.08.2013

частоту можно поднять

http://habrahabr.ru/post/141442/

maksim
Offline
Зарегистрирован: 12.02.2012

Rednaxela пишет:

частоту можно поднять

http://habrahabr.ru/post/141442/

Ну коль такое советуете... Увеличте-ка частоту ШИМа вот в таком простеньком примере:

void setup()
{
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  analogWrite(analogRead(A0)/4);
  
  digitalWrite(ledPin, HIGH);
  delay(100);
  digitalWrite(ledPin, LOW);
  delay(100);
}

 

axill
Offline
Зарегистрирован: 05.09.2011

Rednaxela пишет:

частоту можно поднять

http://habrahabr.ru/post/141442/

"не читайте советских газет" (c)

совершенно крамольная статья. Взялся за МК всерьез - читай даташиты, а не форумы, пусть даже "зарубежные". И зачем было влезать в ардуино, чтобы потом написать на голом Си и развести пальцы от крутости?

sirik
Offline
Зарегистрирован: 10.11.2012

Arduino Uno, в будущем буду переходить на Mega, так как нужно управление несколькими редукторами

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

sirik
Offline
Зарегистрирован: 10.11.2012

Есть и другое решение, точнее идея. Можно купить подобный редуктор, управление в нем осуществляется по каналу шириной 10бит. Но тогда получается, что я заберу 10 ног с Ардуинки, не совсем мне это подходит...

Rednaxela
Offline
Зарегистрирован: 26.08.2013

maksim пишет:

Ну коль такое советуете... Увеличте-ка частоту ШИМа вот в таком простеньком примере:

void setup()
{
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  analogWrite(analogRead(A0)/4);
  
  digitalWrite(ledPin, HIGH);
  delay(100);
  digitalWrite(ledPin, LOW);
  delay(100);
}

int PWM_time=analogRead(A0)/4;
for (int k=0;k<PWM_time) PORTA=B00000001;
for (int k=0;k<256-PWM_time) PORTA=B00000000;

Если на этом же порту нужно мигать диодом, то придется ставить условие внутри for, и изменять через определенное количество циклов запись в порт, например PORTA = B10000001; потом снова цикл и обнуление.

achest
achest аватар
Offline
Зарегистрирован: 01.10.2012

sirik пишет:

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

2 Варианта.

Первый, подразумевает, что скорость редуктора быстро не меняется. Ставь  RC Цепочку.

Выход ардуино через резистор 300ом-1к соеденяешь с конденсатором (на землю). Если твой редуктор имеет высокоомный вход - подключаешь, если не очень, то ставить коллекторный повторитель. Любой транзистор типа КТ 315, коллектор на плюс, базу к конденсатору, эмиттер -выход. + резистор на землю.  конденсатор подбераешь эксперементально.  Нужен осцилограф.

Второй:

Ставить R-2R Матрицу или профессиональный DAC.  Почитай. Недостаток: Занимает выходы. для 8 бит -8 шт.  Что бы сьекономить их:  Или ты ставишь мультиплексор, сдвиговый регистр или покупаешь мегу. Первый вариант "дешевле"

 

 

axill
Offline
Зарегистрирован: 05.09.2011

не пугайте осцилографом)) ТС беспокоят признаки (дребезжание) которые индентифицируются без осцилографа. Я думаю, что ему будет достаточно, чтобы больше не дребезжало. Вместо RC лучше ставить LC, но и то и то подойдет

sirik
Offline
Зарегистрирован: 10.11.2012

Если верить инструкции:

Входной сигнал (Входное сопротивление) (0 ÷ 5 V DC (10 кОм))

Выходной сигнал (см. примечание 1)
Аналоговый выход 1-5 V DC
(сопротивление на нагрузке не менее 500 кОм)
Выходной ключ типа NPN или PNP, выход с открытым коллектором, напряжение до 30 V, ток до 50 мА,
падение напряжения 2.4 V, предназначен для использования совместно с ПЛК или реле

Выходной сигнал ошибки
Выходной ключ типа NPN или PNP, выход с открытым коллектором, напряжение до 30 V, ток до 50 мА,
падение напряжения 2.4 V, предназначен для использования совместно с ПЛК или реле

achest
achest аватар
Offline
Зарегистрирован: 01.10.2012

axill пишет:

не пугайте осцилографом)) ТС беспокоят признаки (дребезжание) которые индентифицируются без осцилографа. Я думаю, что ему будет достаточно, чтобы больше не дребезжало. Вместо RC лучше ставить LC, но и то и то подойдет

На самом деле я его вместо вольтметра использую.  Купил вот этот, собрал и пользуюсь:

http://www.watterott.com/de/Digitales-Speicher-Oszilloskop-Bausatz-DSO-062

размер: Как расберии пи.

Без него настройка займет дольше времени. Мне почему-то кажется, что ТС с 2-ой попыки попадет и останется довольным.

 

 

axill
Offline
Зарегистрирован: 05.09.2011

sirik пишет:

Если верить инструкции:

Входной сигнал (Входное сопротивление) (0 ÷ 5 V DC (10 кОм))

нам только это важно. 10 ком для нашего случая нормально, ставьте RC или LC фильтр. Если вам не нужно быстро менять напряжение можете поставить электролит на несколько десятков или дажу сотню мкФ

sirik
Offline
Зарегистрирован: 10.11.2012

Часто не надо менять, я думаю в районе 5 раз за день, а может и того меньше

зы/ а можно приблизительную схемку подключения фильтра? лучше RC конечно

maksim
Offline
Зарегистрирован: 12.02.2012

Rednaxela пишет:

maksim пишет:

Ну коль такое советуете... Увеличте-ка частоту ШИМа вот в таком простеньком примере:

void setup()
{
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  analogWrite(analogRead(A0)/4);
  
  digitalWrite(ledPin, HIGH);
  delay(100);
  digitalWrite(ledPin, LOW);
  delay(100);
}

int PWM_time=analogRead(A0)/4;
for (int k=0;k<PWM_time) PORTA=B00000001;
for (int k=0;k<256-PWM_time) PORTA=B00000000;

Если на этом же порту нужно мигать диодом, то придется ставить условие внутри for, и изменять через определенное количество циклов запись в порт, например PORTA = B10000001; потом снова цикл и обнуление.

Не важно тот же порт или нет. Ладно, конкретизирую, пусть будет тот же:

void setup()
{
  pinMode(13, OUTPUT);
}

void loop()
{
  analogWrite(11, analogRead(A0)/4);
  
  digitalWrite(13, HIGH);
  delay(100);
  digitalWrite(13, LOW);
  delay(100);
}

13 вывод это PB5 и 11 это PB3. Покажите пример кода эквивалентный этому с увеличенной частотой ШИМа.

achest
achest аватар
Offline
Зарегистрирован: 01.10.2012

sirik пишет:

Часто не надо менять, я думаю в районе 5 раз за день, а может и того меньше

зы/ а можно приблизительную схемку подключения фильтра? лучше RC конечно

Так сразу бы и писал. А то тут тебе все такого (сложного) советуют ... Вот собственно схема.  Ничего сложного. Вместо 1 микрофарады поставь 10 или 50, резистор лучше по меньше, 1к .  Но так тоже работать будет! 

 

http://arduino-info.wikispaces.com/Analog-Output

Если ты по английски понимаешь, то почитай. Под 1 картинкой, есть вторая, это на тот случай, если бы входное сопротивление было маленьким...

sirik
Offline
Зарегистрирован: 10.11.2012

achest пишет:

sirik пишет:

Часто не надо менять, я думаю в районе 5 раз за день, а может и того меньше

зы/ а можно приблизительную схемку подключения фильтра? лучше RC конечно

Так сразу бы и писал. А то тут тебе все такого (сложного) советуют ... Вот собственно схема.  Ничего сложного. Вместо 1 микрофарады поставь 10 или 50, резистор лучше по меньше, 1к .  Но так тоже работать будет! 

 

http://arduino-info.wikispaces.com/Analog-Output

Если ты по английски понимаешь, то почитай. Под 1 картинкой, есть вторая, это на тот случай, если бы входное сопротивление было маленьким...

 

Большое спасибо, буду пробовать

maksim
Offline
Зарегистрирован: 12.02.2012

Вы, кстати, зря не попробовали увеличить частоту ШИМа, может фильтр и не нужен, так как он (фильтр) может уже быть в самом клапане. Но так как вы отказались написать на каком выводе у вас клапан, попробывать не получится.

sirik
Offline
Зарегистрирован: 10.11.2012

На D5 и D6 (использую 2 редуктора). Выбрал я эти выходы потому, что когда пробовал на других (не помню точно на каких) дребезг был еще больше. Методом тыка остановился на этих

В принципе можно использовать любые, так как все выходы/входы доступны

зы/забыл сказать плата Arduino Uno

maksim
Offline
Зарегистрирован: 12.02.2012

5 и 6 лучше не трогать, подключите на 9 и 10 и в сетап добавьте строки:

void setup()
{
  TCCR1B |= 1<<CS10;
  TCCR1B &= ~((1<<CS12)|(1<<CS11));
......

и будет вам ШИМ с частотой 64 кГц.

sirik
Offline
Зарегистрирован: 10.11.2012

Спасибо, буду пробовать. Но есть вопрос, где можно прочитать про эти конструкции? Я так понимаю, тут затрагиваються системные таймера?

Илья73
Offline
Зарегистрирован: 06.09.2013

maksim, Подскажите пожалуйста можно ли повысить частоту шим на 9 и 10 пине в районе около 100 кГц, и как записать это в сетап ?

maksim
Offline
Зарегистрирован: 12.02.2012
Илья73
Offline
Зарегистрирован: 06.09.2013

Сложно все как то (

А можно как то так, как в 21 посте? Какая частота получится следующая? или это предел?

Илья73
Offline
Зарегистрирован: 06.09.2013

Записал в сетап как в 21 посте, померял тестером при 50% скважности, тестер показывает 31,5 кГц.

Поставил по умолчанию ,показывает примерно 475 гЦ, ну почти 490.

Malko4
Offline
Зарегистрирован: 15.02.2015

maksim пишет:

5 и 6 лучше не трогать, подключите на 9 и 10 и в сетап добавьте строки:

void setup()
{
  TCCR1B |= 1<<CS10;
  TCCR1B &= ~((1<<CS12)|(1<<CS11));
......

и будет вам ШИМ с частотой 64 кГц.

Ура, получилось!!! Так просто, совет  от maksim (пост21), просто вставил в скетч. На стандартном ШИМе, моторчик на мощности ниже 50% противно пищит. Повысив частоту ШИМ, писк исчез.

Но, теперь моторчик отказывается крутиться на низкой мощности, а максимума достигает уже при выборе значения 40 (из 255).

Maksim  подскажите, что можно изменить в Вашем примере кода для снижения частоты до 18кГц и до 9кГц?

stakan1986
Offline
Зарегистрирован: 17.02.2015

http://forum.arduino.cc/index.php?topic=117425.0, ссылка на бибилотеку в конце 1 поста

библиотека позволяет выставлять любую частоту по желанию от 31Гц до 2мГц, а заодно задавать 16 битный шим 0-65535(конечно только на 16 битных выводах)

Malko4
Offline
Зарегистрирован: 15.02.2015

stakan1986 пишет:

http://forum.arduino.cc/index.php?topic=117425.0, ссылка на бибилотеку в конце 1 поста

библиотека позволяет выставлять любую частоту по желанию от 31Гц до 2мГц, а заодно задавать 16 битный шим 0-65535(конечно только на 16 битных выводах)

 

Эх, хорошо Вам если понимаете как этим пользоваться. Я же новичек. 

Дайте хотя бы краткую инструкцию, как это применить без танцев.

stakan1986
Offline
Зарегистрирован: 17.02.2015

да собственно ничего сложного. Там вместе с библиотекой идут 2 примера в которых в начале скетча все расписано и показано, почитайте(правда на англицком). А для борьбы с писком двигателей применять надо RC фильтр (см. выше) в сочетании с операционным усилителем (ну это с паяльником надо дружить).

Да и схему подключения мотора к Ардуине нужно было бы посмотреть, чтоб понять почему он так реагирует на изменение частоты ШИМа.

maksim
Offline
Зарегистрирован: 12.02.2012
void setup()
{
  TCCR1B &= ~7;
  TCCR1B |= 2; // от 1 до 7
......

Будет 8 кГц.

maksim
Offline
Зарегистрирован: 12.02.2012

stakan1986 пишет:

А для борьбы с писком двигателей применять надо RC фильтр (см. выше) в сочетании с операционным усилителем (ну это с паяльником надо дружить).

Ага и за одно посоветуйте радиатор побольше на драйвер.

stakan1986 пишет:

Да и схему подключения мотора к Ардуине нужно было бы посмотреть, чтоб понять почему он так реагирует на изменение частоты ШИМа.

Потому и реагиркет, что скорее всего драйвер на полевых ключах, а при больших частотах из-за емкости затвора и получается рекомендуемый вами RC фильтр.

Malko4
Offline
Зарегистрирован: 15.02.2015

Спасибо ребята за отклик!

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

В целом надо следующее: на одном пине ШИМ- 18кГц (50%), а на другом менять скважность на той же частоте (желательно от 0 до 1023) .

stakan1986
Offline
Зарегистрирован: 17.02.2015
/*

 Mimics the fade example but with an extra parameter for frequency. It should dim but with a flicker 
 because the frequency has been set low enough for the human eye to detect. This flicker is easiest to see when 
 the LED is moving with respect to the eye and when it is between about 20% - 60% brighness. The library 
 allows for a frequency range from 1Hz - 2MHz on 16 bit timers and 31Hz - 2 MHz on 8 bit timers. When 
 SetPinFrequency()/SetPinFrequencySafe() is called, a bool is returned which can be tested to verify the 
 frequency was actually changed.
 
 This example runs on mega and uno.
 */

#include <PWM.h>

//use pin 11 on the Mega instead, otherwise there is a frequency cap at 31 Hz
int led = 9;                // the pin that the LED is attached to
int brightness = 0;         // how bright the LED is
int fadeAmount = 5;         // how many points to fade the LED by
int32_t frequency = 35; //frequency (in Hz)

void setup()
{
  //initialize all timers except for 0, to save time keeping functions
  InitTimersSafe(); 

  //sets the frequency for the specified pin
  bool success = SetPinFrequencySafe(led, frequency);
  
  //if the pin frequency was set successfully, turn pin 13 on
  if(success) {
    pinMode(13, OUTPUT);
    digitalWrite(13, HIGH);    
  }
}

void loop()
{
  //use this functions instead of analogWrite on 'initialized' pins
  pwmWrite(led, brightness);

  brightness = brightness + fadeAmount;

  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ; 
  }     
  
  delay(30);      
}

ну вот Вам первый пример, который идет с библиотекой:
- в строке 13 подключаем бибилиотеку PWM.h;
- в строке 19 задаем желаемую частоту - в Вашем случае 18000;
- в строке 24 чтобы все заработало запускаются таймеры;
- в строке 27 выставленная частота устанавливается для соотвествующего пина (SetPinFrequencySafe(led, frequency);).

Всё, дальше в коде вместо analogWrite используем pwmWrite.

Также доступна функция pwmWriteHR, - она то как раз дает возможность задавать значения ШИМ 0-65535 вместо 0-255, но для проМини будет работать только для пинов 9 и 10.
 

 

vodyanov
Offline
Зарегистрирован: 16.02.2015

Наконец-то дошли руки замерить максимально возможную частоту по цифровому порту, при использовании IDE ардуино

Код естественно самый простой:

void setup() {
  // initialize digital pin 13 as an output.
  pinMode(12, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(12, HIGH);   // turn the UP
  digitalWrite(12, LOW);    // turn the DOWN
}

Имеем интерестный результат...

Это UNO R3

А Это MEGA2560 R3

Как видно прирост у UNO, целых 30%. При прочих равных. Это как понимать? Настолько кривой фреймворк, или особенность микросхем?

maksim
Offline
Зарегистрирован: 12.02.2012

А так. Это плата за переносимость, простоту и читабеность кода.

Попробуйте так:

int main()
{
  DDRB |= 1<<5;
  while(1)
  {
    PORTB ^= 1<<5;
  }
}

Будут вам одинаковые результаты, да и частота выше в несколько раз.
Но только есть одно НО - на Uno это будет 13 вывод, а на Mega 11 вывод.

vodyanov
Offline
Зарегистрирован: 16.02.2015

maksim пишет:

А так. Это плата за переносимость, простоту и читабеность кода.

как и предпологалось особенность фреймворка, но это же неправильно? А если у меня проект построен на дергании пина с максимально доступной частотой. К примеру я знаю что UNO, дергает порт с частотой <90кГц.

Настраиваю проект на частоту 80кГц, даю другу, не зная о том что у него MEGA. от запускает скетч.... и бреется, так как его MEGA не дергает порт с частотой более чем 60кГц. Это ведь неправильно! Ясно же что частота работы портов на платах должна быть одинаковая (при той же частоте кварца), пусть даже по самому минимальному значению.

vodyanov
Offline
Зарегистрирован: 16.02.2015

Кстати и UNO, и MEGA показала по потру 1,6мГц.

 

maksim
Offline
Зарегистрирован: 12.02.2012

vodyanov пишет:

но это же неправильно? А если у меня проект построен на дергании пина с максимально доступной частотой. 

С чего это вдруг неправильно? Универсальность всегда сопровождается усложнением, утяжелением, замедлением, увеличиванием объема и т.д. и это касается не только программных продуктов.

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

 

maksim
Offline
Зарегистрирован: 12.02.2012

А вообще для вашей задачи есть функция tone(), вот она и будет вам на всех контроллерах давать одинаковую заданную частоту.

vodyanov
Offline
Зарегистрирован: 16.02.2015

В принципе да, вроде при определённых условиях хрошая функция, да и работает до 80кГц. Спасибо!

platinumwolf
Offline
Зарегистрирован: 24.03.2016

Параметра изменения ШИМ от 30.64 Hz до 62500.00 Hz

видел тут

http://t-brain.ru/?p=112

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

На Ардуино, чаще всего, используется базовая частота в 16 МГц.

Если посмотреть в wiring.c в IDE, то можно увидить, что параметр prescaler, на ВСЕ TCCRxB ставится "011" битовое, то есть делитель 64.

Режим ставится - phase correct pwm mode, в этом режиме счетчики считают вверх, потом вниз, при пересечении заданного значения "вверх" - выключаем пин порта вывода, на обратном  - включаем. Всего в периуде - 255+255=510 тактов.

Итого частота 16 000 000 / (510*64) = 490 Гц.

Всего в нашем процессоре используются 5 вариантов "прескалер" - 1,8,64,256,1024 - "001","010","011","100","101" - соответственно

Тем, кто хочет быстрее, можно задать прескалер в 1 или 8, и получить примерно 32КГц и 4КГц.

Только нужно учесть, что таймер используется сразу несколькими ШИМ выводами.

Для моей ардуинки на 32U4 - примерно так

таймер 0 - d3,  d11

таймер 1 - d9, d10

таймер 3 - d5,

таймер 4 - d6, d13( если есть ШИМ на нем)

для 168:

Три таймера 6 выходов

0 - 8 бит, два выхода, номера пинов ищите на схемотехнике своей ардуинки, OC0A, OC0B

1 - 16 бит, OC1A и OC1B

2 - 8 бит, хитрый, OC2A и OC2B

 

Для других - иначе - читайте датаШит сами ;).

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

установить 4 КГЦ:

cbi(TCCR3B, CS30);
sbi(TCCR3B, CS31);
cbi(TCCR3B, CS32);

установить 32 КГЦ:

sbi(TCCR3B, CS30);
cbi(TCCR3B, CS31);
cbi(TCCR3B, CS32);

вместо макросов можно использовать битовые операции, но тогда код не сильно читаемый.

---------------------------------------

Можно делать более тонкую настройку, так как Таймеры 1и 3 - 16 разрядные, а wiring - библиотека использует их как 8-разрядный., но тогда нужно глубоко понимать работу контроллера, задавать TOP отдельно, и лучше делать это с Таймером4, он 10 разрядный.

Все это потребует глубокого погружения в программирование на С и микроконтроллеры.

Без проблемм - написано выше: вариант 4 и 32 КГц.

sidienko_91@mail.ru
Offline
Зарегистрирован: 23.05.2016

Какие есть ещё способы уеличения частоты?

 

a5021
Offline
Зарегистрирован: 07.07.2013

Разгон.

GraninDm
Offline
Зарегистрирован: 01.08.2013
sidienko_91@mail.ru
Offline
Зарегистрирован: 23.05.2016
include <LiquidCrystal.h>
LiquidCrystal lcd(3, 5, 9, 10, 11, 12);
 
int ENA=6;
int IN1=7;
int IN2=8;
int vol=A0;
int DEW=A1;
const int LEW=4;
const int REHT=2;
int CHAG=1;
volatile float vremia=0;
int foto;
int foto_ish;
volatile float time=0;
volatile float time_last;
volatile float time_norm;
void setup()
{
 pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(LEW,INPUT);
pinMode(REHT,INPUT);
pinMode(DEW,INPUT);
Serial.begin(9600);
Serial.println(" Time  Nc      vol     Cikl   T_cikl");
  lcd.begin(20, 4);
 
  lcd.print("Nc    vol    Time  ");
   lcd.setCursor(0,2);
  lcd.print("  Cikle     T_cikl  ");
}
 
void loop()
{
//delay(2000);
{
  foto=analogRead(DEW);
  //foto_ish=foto;
   //for(value=10; value<=256; value+=30);
  CHAG=CHAG+1; 
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,HIGH);
  analogWrite(ENA,CHAG);
  delay(20);
  foto=analogRead(DEW);
  
  time=millis()-time_last;
  time_last=millis();
  vremia=millis();
  
  lcd.setCursor(0,1);
  lcd.print(CHAG);
  lcd.setCursor(6,1);
  lcd.print(foto);
  lcd.setCursor(12,1);
  lcd.print(vremia/1000);
  //lcd.setCursor(16,1);
 // lcd.print(REHT);
   lcd.setCursor(1,3);
  lcd.print(time);
  time_norm=time*CHAG;
     lcd.setCursor(12,3);
  lcd.print(time_norm/1000);  
    delay(10);
    
    if(digitalRead(REHT)==HIGH)
   {
     delay(50);
   }
    else 
    {
//Serial.println(" Millic    Nc     vol        Cikl       Time");
Serial.print(vremia/1000);
Serial.print("   ");
Serial.print(CHAG,DEC);
Serial.print("     ");
Serial.print(foto,DEC);
Serial.print("    ");
Serial.print(time);
Serial.print("   ");
Serial.println(time_norm/1000);
 
   CHAG=50;
  digitalWrite(IN1,LOW);
  digitalWrite(IN2,5);
   delay(10000);
      digitalWrite(IN2,1);
       delay(10000);
     analogWrite(ENA,CHAG);
     delay(3000);
     CHAG=250;
     delay(1000);
         CHAG=0;
       delay(6000);  
    lcd.setCursor(0,1);
 lcd.print("                    ");
 lcd.setCursor(0,3);
 lcd.print("                    ");
 
  time=0;
    }
  }
}
 
 
 
 
нужна помощь, необходимо внести корректировку чтобы напряжение подовалось постепенно с меньшего к большему
sivanko
Offline
Зарегистрирован: 25.02.2016

maksim пишет:

5 и 6 лучше не трогать, подключите на 9 и 10 и в сетап добавьте строки:

void setup()
{
  TCCR1B |= 1<<CS10;
  TCCR1B &= ~((1<<CS12)|(1<<CS11));
......

и будет вам ШИМ с частотой 64 кГц.

Добрый день. Возникло несколько вопросов:

1. Частота ШИМа меняется на всех "ногах" или только на 9 и 10?

2. Если я у себя в изменю код (просто добавлю в сетап 2 строчки) , то получу необходимое увеличение частоты на выводе 9 и 10?

Заранее спасибо за ответы.

 

denw
Offline
Зарегистрирован: 11.12.2015

Не забудьте защитить входы :http://olden.in.ua/articles/182-protecting-adc-inputs

АЦП

Andronimus
Offline
Зарегистрирован: 22.09.2016

Пробовал arduino nano до максимума разогнать шим, конечно он ужасной формы. Предел оказался 2мгц,