Проблема с функцией tone

Romanoff
Offline
Зарегистрирован: 29.09.2015

Привет, ребята! Задался целью сделать генератор прямоугольных импульсов с применением функции tone. Подключен LCD shield, показывает частоту. Все вроде было неплохо, пока не поставил lcd. Теперь tone не реагирует на ручку потенциометра. Понимаю проблема в проге. Помогите разобраться.

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );
long prevmil = 0;
long interval = 500;
int pot = A5;
int S = 2;
int potval = 0;
int freq = 30;

void setup() {
  lcd.begin(16, 2);
  lcd.setCursor(3, 0);
  lcd.print("BMW GARAGE");
  delay(1000);
  lcd.clear();
  Serial.begin(9600);
  pinMode(S, OUTPUT);
}

void loop() {
  unsigned long mil = millis(); //тут я делаю это, потому, что
  if(mil - prevmil > interval)  //когда значения переходят от 3х значных
  {                             //к 2х значным, ноль в конце не стирается с экрана
    prevmil=mil;
    lcd.setCursor(9, 1);
  lcd.print(" ");
  }
    

  potval = analogRead(pot);
  potval = constrain(potval, 0, 1023);
  freq = map(potval, 0, 1023, 30, 400);
  freq = constrain(freq, 30, 400);
  lcd.setCursor(10, 1);
  lcd.print("Hz");
  lcd.setCursor(3, 0);
  lcd.print("Frequency");
  lcd.setCursor(7, 1);
  lcd.print(freq); //выводим на дисплей частоту
  
  tone(S, freq, 20); //на этом пине частота остается неизменной
  Serial.print(freq);//хотя на экране значения меняются

}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Romanoff, минимальная частота, которую генерит тоне()  -16000000/1024/256/2  = 30,517578125 Гц Поэтому некорректно требовать от неё гудеть на 30 герцах. Ставьте 31.  И уберите констрейны, они тут совершенно не нужны.

Romanoff
Offline
Зарегистрирован: 29.09.2015

Сделал, как вы сказали. Не помогло. До подключения экрана и 30герц генерил(ну может и не 30, но был чувствителен к положению переменника во всем диапазоне). Констрейны поставил , когда пытался побороть глюк с нулями.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Romanoff, значит сделали не так, как я сказал. Сейчас залил ваш скетч с поправкой вместо вместо 30 -31, остальное не менял -всё работает.

Romanoff
Offline
Зарегистрирован: 29.09.2015
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );
long prevmil = 0;
long interval = 500;
int pot = A5;
int S = 2;
int potval = 0;
int freq = 31;

void setup() {
  lcd.begin(16, 2);
  lcd.setCursor(3, 0);
  lcd.print("BMW GARAGE");
  delay(1000);
  lcd.clear();
  Serial.begin(9600);
  pinMode(S, OUTPUT);
}

void loop() {
  unsigned long mil = millis(); //тут я делаю это, потому, что
  if(mil - prevmil > interval)  //когда значения переходят от 3х значных
  {                             //к 2х значным, ноль в конце не стирается с экрана
    prevmil=mil;
    lcd.setCursor(9, 1);
  lcd.print(" ");
  }
    

  potval = analogRead(pot);
  freq = map(potval, 0, 1023, 31, 400);
  lcd.setCursor(10, 1);
  lcd.print("Hz");
  lcd.setCursor(3, 0);
  lcd.print("Frequency");
  lcd.setCursor(7, 1);
  lcd.print(freq); //выводим на дисплей частоту
  
  tone(S, freq, 20); //на этом пине частота остается неизменной
  Serial.print(freq);//хотя на экране значения меняются

}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Romanoff, т.к. не успел разобрать ардуину - залил ваш скетч из #4 не смотря - работает. Звук есть, частота меняется. Если у вас не работает, значит косяк в аппаратной части.

Romanoff
Offline
Зарегистрирован: 29.09.2015

А LCD shield у вас сопряжен с дуиной?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

У меня не шилд , просто Lcd индикатор с проводками.

Romanoff
Offline
Зарегистрирован: 29.09.2015

В общем поменял выход генератора на pin11 и теперь все работает. Видимо pin1-3 не работают, когда подключен шилд.

Romanoff
Offline
Зарегистрирован: 29.09.2015

Подскажите кто нибудь пожалуйста, как можно реалиовать изменение скважности в tone. Или каким либо еще способом.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Romanoff ,   tone() не умеет , это узко специализированная функция. Посмотрите это, это то-же самое по сути, но с большими возможностями.

Romanoff
Offline
Зарегистрирован: 29.09.2015

Привет всем снова у меня есть вопрос, хоть уже и косвенно связанная с функцией tone. Хочу спросить какая амплитуда сигнала на выходе при использовании этой функции??? У меня 1 вольт по осцилографу. Я думал, что должно быть 5в....

На выход ардуины поставил транзистор дарлингтона TIP 142 в ключевом режиме, в качестве нагрузки должны были быть форсунки... И как итог не работает моя схема. Посмотрел на осцилографе, сигнал получился инвертированым..При этом, до транзистора с выхода дуины сигнал изменяется от 0в до 1в, после транзистора с 0 до -4в. Поставил мосфет IRF640. Тоже самое. Подскажите, я знаю, что делаю что то на так. Мне на выходе транзистора нужны импульсы 0-12в.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Romanoff пишет:

сигнал получился инвертированым

Так при схеме с общим эмиттером он всегда инвертированный, а Вы какого ждали?

Romanoff пишет:

При этом, до транзистора с выхода дуины сигнал изменяется от 0в до 1в, после транзистора с 0 до -4в.

1. Отключите транзистор вообще, оставьте ногу ардуины голой и померьте амплитуду. Если там будет 5В, то проблема в схеме включения транзистора. Сообщите нам какая амплитуда на голой ноге.

2. Схему включения в любом случае в студию. При правильном включении всё должно нормально работать даже с амплитудой в 0,5В.

Romanoff
Offline
Зарегистрирован: 29.09.2015

На ноге ардуины, как и говорил ранее 1вольт. Схемку накидаю.

Romanoff
Offline
Зарегистрирован: 29.09.2015

например вот на выходе генератора 1вольт. На выходе 5 вольт. В проге все работает . Подключил светодиод.

http://i57.fastpic.ru/big/2015/1019/fc/23a69a1fcc28c4fb497113da7635e3fc.jpg

http://i60.fastpic.ru/big/2015/1019/66/1700445573657876ec38c29270d61e66.jpg

извиняюсь осцил только в dc не поставил

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы меня не поняли. Меня интересует амплитуда на ноге БЕЗ транзистора - всё отключите и оставьте ногу голой.

Теперь по схеме.

А где токоограничивающий резистор в базе? Там ведь ток "мама не горюй" вылезет. Неудивительно, что напряжение проседает. Поставьте в базу транзистора резистор МИНИМУМ270 ом, а лучше 430 ом или килоом (Вы умеете этот резистор рассчитывать?). Затем от соединения "база-резистор" к земле поставьте ещё один резистор в 10-20 раз больше базового.

 

Romanoff
Offline
Зарегистрирован: 29.09.2015

Попробую завтра все отключить и посмотреть на сигнал)

Я пробовал ставить резистор между выходом мк и транзистором, в итоге амплитуда на выходе транзистора становится меньше. Стягивающий резистор с базы на землю пробовал, но это не обязательно, tip 142 внутри имеет  такой резистор. В общем то при моделировании в Proteus все работает как надо, амплитуда на выходе транзистора 5 вольт, как и acc. На практике амплитуда меньше на 4-5вольт чем acc. Завтра запишу видео чтоль))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не знаю, что там в протеусе, но падение напряжения на переходе база-эмиттер у составоного траннзистора 1,2 вольта (у обычного - 0,6) - Вот их Вы и видите. Остальное должно упасть на базовом резисторе! А то, что у Вас в коллекторной цепи напряжение упало - Вы какой резистор в базу ставили? В любом случае это не повод брать сч ноги ардуины такой громадный ток, как Вы берёте. Как ещё нога жива (если жива)

Romanoff
Offline
Зарегистрирован: 29.09.2015

хз. Я читал что для составного хватит и 5мА.  Все бы хорошо если брать в расчет, что вывод с мк при использовании функции tone 5вольт, то 5-1.2=3,8/68 Ом= 5мА. Пробовал и больше и меньше.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Интересно, как у Вас при 3.8 В и 68 Ом получается 5 мА?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Romanoff пишет:

хз. Я читал что для составного хватит и 5мА.  Все бы хорошо если брать в расчет, что вывод с мк при использовании функции tone 5вольт, то 5-1.2=3,8/68 Ом= 5мА. Пробовал и больше и меньше.

5-1.2=3,8/68 Ом= 56мА. Надеюсь, Вы не надолго включали.

И ещё, что Вы там меряете между коллектором и эммитером? Что Вы надеятесь там увидеть? Когда транзистор закрыт, там будет напряжение питания, а когда открыт в режиме насыщения, там будет напряженние насыщения Э-К (см. даташит транзистора, обычно для дарлингтонов вольта полтора). 

Мерять надо на нагрузке. Тогда при закрытом транзисторе там будет близко к нулю, а при полностью открытом - напряжние птиания за вычетом того самого напряженния насыщения Э-К. Большего на нагрузке Вы не добьётесь.

Romanoff
Offline
Зарегистрирован: 29.09.2015

Простите 680 Ом

Romanoff
Offline
Зарегистрирован: 29.09.2015

Не понял вопроса..??? Между коллектором и эмитером не мерю. Я мерю между acc и коллектором. Под нагрузкой.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

Romanoff
Offline
Зарегистрирован: 29.09.2015

Спасибо всем ребята) В общем дело оказалось в том, что на 11 pin амплитуда 2в, изменил на 12 pin.  Амплитуда 5в. После транзистора чуть больше 10 вольт. Буду пробовать на практике)

Romanoff
Offline
Зарегистрирован: 29.09.2015

ЕвгенийП пишет:

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

Не между коллектором и базой))) А на коллекторе и на базе) У меня как видите на втором рисунке 2 осцилограммы