Регулировка длительности импульса

kalyan-m@mail.ru
Offline
Зарегистрирован: 05.12.2014

Добрый день! Подскажите пож. кто разбирается, частота 1 Гц, прямоугольный импульс, нужно сделать регулировку ширины импульса от 0 до 100 % , т.е при 0% светодиод не светиться, на 50% 0,5 сек горит 0,5 сек не горит, на 100% светиться непрерывно, код на делай ниже.  пробовал на миллис не выходит, как мне от делай избавиться? % меняются согласно положению переменного резистора.

void loop() {
  
  x=analogRead(A1);
x = constrain(x, 0, 1000);

int   a = map(x, 0, 1023, 0, 100);
  //int b = map(analogRead(A0), 0, 1023, 0, 100);
  disp.displayInt(a);
  y=1000-x;
  digitalWrite(0,HIGH);
  
  delay(x);
  digitalWrite(0,LOW);
  delay(y);
}

 

 

nik182
Offline
Зарегистрирован: 04.05.2015

Что делает строка 8?

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

1. в песочницу

2. а лучше удалить и читать "блинк без делей" до простветления.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Скорее всего, очередное бессмысленное учебное задание. 

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

ТС! Вот представь, что ты столяр. Приходит дитё и говорит: "Я  раньше гвоздями все крепил, а теперь мне шурупы дали, как его ловчее молотком забить?". Первому ты отвечаешь, что нужна отвертка, второму, третьему, тридцатому... а сотому говоришь "Иди нахер!".

Так вот понятно?

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

kalyan-m@mail.ru пишет:
как мне от делай избавиться?
Можно по-разному. Чтобы ответить, нужно знать, какова цель избавления от делэй?

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

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

kalyan-m@mail.ru пишет:
как мне от делай избавиться?
Можно по-разному. Чтобы ответить, нужно знать, какова цель избавления от делэй?

Кстати вариант - черным маркером. А почему нет?

kalyan-m@mail.ru
Offline
Зарегистрирован: 05.12.2014

Ну началось.... опять «умники» пис*ками меряются)))) ведь просил кто знает, у не у кого длиннее, про  песочницу не спорю, надо было туда, действительно.  Ту статью про delay читал, не особо понял, «умники» зафлудили путный топик. 8 строка выводит показания на дисплей, это все работает, dalay убрать нужно чтоб другте задачи выполнять параллельно, может есть у когото кусочек кода для этих целей, без всяких там столяров и прочих безполезных бла бла бла 

 "блинк без делей» конечно работает, но там частота меняется от значения interval, при 50% заполнении, а у меня немного другая задача

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

kalyan-m@mail.ru пишет:

Ну началось.... опять «умники» пис*ками меряются))))

Ну, началось, опять «дурики», вместо простых ответов на простые вопросы, начинают учить как им надо помогать.

kalyan-m@mail.ru пишет:

может есть у когото кусочек кода для этих целей

А то! Держите! Вот Вам работающий "кусочек кода" - частота 1Гц, Процессор не занимает от слова совсем - по нулям. Заполнение задаётся функцией setBrightness (в строке №21 задано 64% для примера). Только что проверял на Nano - 100% работает.

//
// ШИМ с частотой 1Гц на пине D9
// заполнение задаётся функцией setBrightness от 0% до 100%
//

constexpr uint8_t prescaler1024 = 5;
constexpr uint16_t for1Hz = 15625;

//
// Установить яркость (0% - 100%)
//
inline void setBrightness(const uint8_t br = 50) {
	OCR1A = map(constrain(br, 0, 100), 0, 100, 0, for1Hz - 1);
}

void setup(void) {
	pinMode(9, OUTPUT);
	TCCR1A = bit(COM1A1) | bit(WGM11);
	TCCR1B = bit(WGM13) | bit(WGM12) | prescaler1024;
	ICR1 = for1Hz;
	setBrightness(64);
}

void loop(void) {}

Только не говорите теперь, что Вам что-то непонятно, и не требуйте объяснений. Я пытался Вам объяснить, но Вам не нужны объяснения, Вам "кусочек кода" нужен. Вот и кушайте его с маслом.

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

kalyan-m@mail.ru пишет:

 "блинк без делей» конечно работает, но там частота меняется от значения interval, при 50% заполнении, а у меня немного другая задача

ДУрень! Вот код "блинк без делей" с этого сайта, с того на котором мы сейчас.

/* Blink without Delay
 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen
 */

const int ledPin =  13;      // номер выхода, подключенного к светодиоду
// Variables will change:
int ledState = LOW;             // этой переменной устанавливаем состояние светодиода 
long previousMillis = 0;        // храним время последнего переключения светодиода

long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)

void setup() {
  // задаем режим выхода для порта, подключенного к светодиоду
  pinMode(ledPin, OUTPUT);      
}

void loop()
{
  // здесь будет код, который будет работать постоянно
  // и который не должен останавливаться на время между переключениями свето
  unsigned long currentMillis = millis();
 
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval) {
    // сохраняем время последнего переключения
    previousMillis = currentMillis;  

    // если светодиод не горит, то зажигаем, и наоборот
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin, ledState);
  }
}

А вот код того, что тебе нужно. добавлено 6 строк и рамочки из "//////////////"

/* Blink without Delay
 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen
 */

const int ledPin =  13;      // номер выхода, подключенного к светодиоду
// Variables will change:
int ledState = LOW;             // этой переменной устанавливаем состояние светодиода 
long previousMillis = 0;        // храним время последнего переключения светодиода

long interval = 0;           // интервал между включение/выключением светодиода (1 секунда)

///////////////////////////////////////
long On_interval = 0;
long Off_interval = 1000;
byte inputPin = A1;
///////////////////////////////////////
void setup() {
  // задаем режим выхода для порта, подключенного к светодиоду
  pinMode(ledPin, OUTPUT);
////////////////////////////////////////////
  interval = Off_interval;      
///////////////////////////////////////////
}

void loop()
{
  // здесь будет код, который будет работать постоянно
  // и который не должен останавливаться на время между переключениями свето
  unsigned long currentMillis = millis();
 
///////////////////////
  On_interval = map(analogRead(inputPin),0,1023,0,1000);
  Off_interval = 1000 - On_interval;
///////////////////////////
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval) {
    // сохраняем время последнего переключения
    previousMillis = currentMillis;  

    // если светодиод не горит, то зажигаем, и наоборот
    if (ledState == LOW) {
      ledState = HIGH;
      //////////////////
      interval = On_interval;
      //////////////////
      }
    else {
      ///////////////
      interval = Off_interval;
      /////////////////
      ledState = LOW;
      } 

    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin, ledState);
  }
}

 

kalyan-m@mail.ru
Offline
Зарегистрирован: 05.12.2014

Ну ты кудесник!!! Буду пробовать спасибо большое)))

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

Граф,

а чем мой ШИМ не устроил? Вроде ж ТС написал

kalyan-m@mail.ru пишет:
нужно чтоб другте задачи выполнять параллельно
так вроде ШИМ для этого лучше - ничего вообще делать не надо, само мигает. Да и в плане выноса мозга, ШИМ пошибчее будет.

Или просто параллельно писали?

kalyan-m@mail.ru
Offline
Зарегистрирован: 05.12.2014

Я читал в Вашей статье, классно, но не хотелось мне с таймерами разбираться для столь «низменных» целей))) спасибо за труд!!!

kalyan-m@mail.ru
Offline
Зарегистрирован: 05.12.2014

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

Граф,

а чем мой ШИМ не устроил? Вроде ж ТС написал

kalyan-m@mail.ru пишет:
нужно чтоб другте задачи выполнять параллельно
так вроде ШИМ для этого лучше - ничего вообще делать не надо, само мигает. Да и в плане выноса мозга, ШИМ пошибчее будет.

Или просто параллельно писали?

обязательно буду использовать в следующих проектах!!!

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

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

Граф,

а чем мой ШИМ не устроил? Вроде ж ТС написал

kalyan-m@mail.ru пишет:
нужно чтоб другте задачи выполнять параллельно
так вроде ШИМ для этого лучше - ничего вообще делать не надо, само мигает. Да и в плане выноса мозга, ШИМ пошибчее будет.

Или просто параллельно писали?


Женя! Первое - да, писал параллельно. А второе то, что человек не мог осознать, что изменить в блинк-без-делей! Чисто педагогическая цель была.

Pyotr
Offline
Зарегистрирован: 12.03.2014

Теперь нужно поставить ТС оценку за проделанную работу)))

ТС, а чтоб еще точней интервалы ШИМ выдерживались, замени millis()  на micros(). Чего все на миллисе помешались)))

Ну и избався от map().

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

wdrakula пишет:
Чисто педагогическая цель была.
Понятно. А у меня
ЕвгенийП пишет:
в плане выноса мозга
Потому и результаты разные :-)