понедельник, 18 апреля 2016 г.

Плавное мигание светодиодом или осваиваем массивы…

Конечно же можно все реализовать при помощи тригонометрической функции (sin). Используя данную функцию, можно на аналоговом выходе получить сигнал синусоидальной формы. Если к такому выходу подключить светодиод, то он будет плавно «мигать»: то плавно разгораться, то плавно угасать…
Но данная функция будет «напрягать» непрерывным вычислительным процессом сам микроконтроллер, ведь цикл условно говоря бесконечный, и каждый раз микроконтроллер должен рассчитывать одни и те же значения, что является нерациональным решением. Более практично вычислить заранее значений синусов, и представить данные в виде массива.
Выполнить все необходимые расчёты и создать массив данных удобно в небольшой программе Sinus Tab. По сути вам ничего не нужно делать: просто запустите программу, и нажмите кнопку «CALC». В окне программы появиться массив чисел, которые мы скопируем и вставим в программу Ардуино.

После запуска программы (скетч можно взять здесь: жми сюда...) мы увидим, как светодиод будет плавно мигать: то плавно разгораясь, то плавно угасать. Но гораздо интереснее подключить вместо светодиода RC цепь, и далее на выход цепи осциллограф. Как вы думаете какой мы тогда сможем увидеть сигнал? Наверно вы догадались: синусоиду, но нам же интересно поэкспериментировать!
Теперь давайте разберем подробнее что из себя представляет такая RC цепь. А это не что иное как простейший ЦАП (цифровой аналоговый преобразователь). То есть благодаря такой цепи мы сможем цифровой сигнал «превратить» в аналоговый. Номиналы радиодеталей: конденсатор 1 мкФ, резистор 10кОм. Вот и все! Пробуем все теперь на практике, и действительно очень интересно наблюдать как цифровой сигнал прямоугольной формы превращается в синусоиду…

Но вернемся опять к нашему скетчу. Все же не очень хорошо, когда для генерации данных используется сторонняя программа. А нельзя ли сделать так: пусть один раз микроконтроллер все же просчитает нужное значение (в нашем следующем примере 180 значений) и запишет их в массив. А уже потом во втором цикле (так называемая «петля») будет брать готовые вычисленные ранее значения. Скетч заметно стал меньше:
int ledPin=11;
float mas [180];
int led;

void setup() {
pinMode (ledPin, OUTPUT);
for (int x=0; x<180; x++)
{
  mas[x]=(255*(sin(x*3.1415/180))); // запись расчетных значений в массив
}
}

void loop() {
 for(int y=0; y<180; y++)
 {
  analogWrite (ledPin, mas[y]);
  delay (10);
 }
}
Но заметьте, что все работает точно так же: светодиод плавно мигает. Причем скетч в котором мы хранили массив использует 1 510 байт (4%) памяти устройства. Всего доступно 32 256 байт. Глобальные переменные используют 268 байт (13%) динамической памяти, оставляя 1 780 байт для локальных переменных. Максимум: 2 048 байт.

Теперь сравним со вторым скетчем, где данные рассчитываются и помещаются в массив. Второй скетч использует 2 632 байт (8%) памяти устройства. Всего доступно 32 256 байт. Глобальные переменные используют 731 байт (35%) динамической памяти, оставляя 1 317 байт для локальных переменных. Максимум: 2 048 байт.

 Вот такое неожиданный результат! Но впрочем проверить пожалуй стоило. До встречи в следующем уроке. 

4 комментария:

  1. КАК заставить плавно мигать светодиод на аналоговом пине?

    ОтветитьУдалить
  2. Так, что с масивом программа стала более громоздкой, но процесор разгружен???

    ОтветитьУдалить
  3. Почему нельзя использовать вот это?
    void setup() {
    pinMode (11, OUTPUT);
    }

    void loop() {
    for (byte i=0; i<255; i=i+1)
    {
    analogWrite(11, i);
    delay(3);
    }
    for (byte i=255; i>0; i=i-1)
    {
    analogWrite(11, i);
    delay(3);
    }
    }

    ОтветитьУдалить
  4. Синусоида имеет форму волны (плавные пики и впадины) А так как ты предложил , получается форма как у пилы строгие триугольники .Для индикации пойдет, но не получится желаемая синусоида.

    ОтветитьУдалить