Светодиод питания ШИМ выходит из строя при близком к нулевому пороге

Я использую таймер 1, режим 8, на контактах 9 и 10 на частоте 1 кГц. Мой ШИМ-сигнал прерывается, когда я поворачиваю потенциометр чуть выше того места, где я установил ноль, независимо от того, где я установил ноль. Включаю Arduino atmega328p с помощью Vin и отключаю от ПК. У меня есть потенциометр на A0 и вывод 9 или 10, подключенный к осциллографу. У меня есть код и картинка ниже.

Проблема с моим кодом заключается в том, что я не могу заставить TCNT1 или TCNT2 начинаться с того места, где я его установил, кроме нуля.

#include <avr/io.h>
#include <avr/interrupt.h>
//#включить <SPI.h>
//ISR(TIM1_COMPA);
//ISR(TIM1_CAPT);

int analogInPin = PC0;
int analogOutPin9 = PB1;
int analogOutPin10 = PB2;
int analogOutPin3 = PD3;
int analogOutPin11 = PB3;
//int аналогInPin = A0;
//целый аналогOutPin9 = 9;
//целый аналогOutPin10 = 10;

int sensorValueTimer1;
int sensorValueTimer2;

void sens(int &sensorValueTimer1, int &sensorValueTimer2){
   sensorValueTimer1 = (((long)analogRead(analogInPin)*1000)/1023);
   if (sensorValueTimer1 < 35){  // чтобы остановить мерцание на нижнем конце
     sensorValueTimer1 = 0;
     }
        sensorValueTimer2 = (((long)analogRead(analogInPin)*255)/1023);
   if (sensorValueTimer2 < 0){  // чтобы остановить мерцание на нижнем конце
     sensorValueTimer2 = 0;
     }
}

void updateOCRnx(){
  sens(sensorValueTimer1,sensorValueTimer2);
  int x = sensorValueTimer1;
  int y = sensorValueTimer2;
  OCR1A = x;
  OCR1B = x;
  OCR2A = y;
  OCR2B = y;
}

void setup() {
  Serial.begin(9600);
  //===============режим 5 пин 3,11==================//
  /*
  //TCCR2A = 0;
  //TCCR2B = 0;
  TCCR2A |= (1<<COM2A1);
  TCCR2A |= (1<<COM2A0);
  TCCR2A |= (1<<COM2B1);
  TCCR2A |= (1<<COM2B0);
  TCCR2A |= (1<<WGM21);
  TCCR2A |= (1<<WGM20);
  TCCR2B &= ~(1<<WGM22);
  TCCR2B &= ~(1<<CS22);
  TCCR2B |= (1<<CS21);
  TCCR2B |= (1<<CS20);

  //TIMSK2 |= (1<<OCIE2A);
  //TIMSK2 |= (1<<OCIE2B);
  //TIMSK2 |= (1<<TOIE2);
  //ASSR &= ~(1<<TCN2UB);
  //TIFR2 |= (1<<OCF2A);
  //TIFR2 |= (1<<TOV2);


  TCNT2 = 100;
 */
  //====================режим 5 пин 3,11=====================/ /
  //=====================режим 8 пин 9,10====================== //
  //TCCR1A = 0;

  TCCR1A |= (1<<COM1A1);
  TCCR1A &= ~(1<<COM1A0);
  TCCR1A |= (1<<COM1B1);
  TCCR1A &= ~(1<<COM1B0);
  TCCR1A &= ~(1<<WGM11);
  TCCR1A &= ~(1<<WGM10);
  TCCR1B |= (1<<WGM13);
  TCCR1B &= ~(1<<WGM12);
  TCCR1B |= (1<<CS11);
  TCCR1B &= ~(1<<CS12);
  TCCR1B &= ~(1<<CS10); 


  //TCCR1B |= (1<<ICES1);

  //TCCR1C |= (FOC1A);
  //TCCR1C |= (FOC1B);

  ICR1=1000;  //1.333КХ
  TCNT1=0;

  //TIMSK1 |= (1<<TOIE1);
  //TIMSK1 |= (1<<OCIE1A);
  //TIMSK1 |= (1<<OCIE1B);
  //TIMSK1 |= (1<<МКПП1);
  //TIFR1 |= (1<<TOV1);
  //TIFR1 |= (1<<OCF1A);
  //TIFR1 |= (1<<OCF1B);

  //EIMSK |= (1<<INT1);
  //EIFR |= (1<<INTF1);
  // EICRA &= ~(1<<ISC11);
  // EICRA &= ~(1<<ISC10);

  //PCMSK0 |= (1<<PCINT2);
  //PCICR |= (1<<PCIE0); // прерывание смены контакта 0 включено
  //PCIFR |= (1<<PCIF1); // запускает запрос на прерывание
  //======================режим 8 пин 9,10=================== ====//

  sei();

  //pinMode(analogOutPin9,OUTPUT);
  //pinMode(10, INPUT);
  //pinMode(analogInPin, INPUT);

  //символьные данные;

  DDRB |= (1<<analogInPin);
  DDRB |= (1<<analogOutPin9);
  DDRB |= (1<<analogOutPin10);
  DDRB |= (1<<analogOutPin11);
  DDRB |= (1<<analogOutPin3);
  //DDRB |= (1<<PB5);
  //DDRB &= ~(1<<PB4);

  //SPSR |= (1<<SPIF);

  //SPCR |= (1<<SPE);
  //SPCR |= (1<<MSTR);
  //SPSR &= ~(SPR1);
  //SPCR |= (1<<SPR0);
  //SPSR |= (1<<SPI2X);

  //СПДР = данные;

}


void loop() { 
  updateOCRnx();
  Serial.println(TCNT1);
  // задержка (100);
  //int sensorValue = (((long)analogRead(analogInPin)*1000)/1023);
  //int sensorValue = AnalogRead(analogInPin);
  //аналоговая запись(аналоговыйвыход9,сенсорноезначение/4);
  //analogWrite(analogOutPin10, sensorValue/4);
  //Serial.println(analogOutPin9);
}

, 👍-1

Обсуждение

Какой режим триггера установлен на вашем осциллографе? Авто или Нормально?, @VE7JRO

Режим триггера был установлен на автоматический, я установил его на нормальный, я все еще вижу, как прямоугольная волна немного расширяется примерно на 1/10 секунды и повторяется каждые полсекунды. Я вижу то же самое на светильнике со светодиодом CREE XPE2. Он мерцает примерно так же, как мерцает осциллограф, когда мой потенциометр MCIGICM 10 кОм находится очень близко к тому месту, где я установил ноль. Мои кораллы и мои глаза полны благодарности за направление., @northershoveler


1 ответ


-1

Вывод аналогового считывания нестабилен. Это исправило это, ResponsiveAnalogRead, из github

,

Это расплывчатое объяснение и ИМХО неочевидно, @Sim Son