Светодиод питания ШИМ выходит из строя при близком к нулевому пороге
Я использую таймер 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);
}
@northershoveler, 👍-1
Обсуждение1 ответ
▲ -1
Вывод аналогового считывания нестабилен. Это исправило это, ResponsiveAnalogRead, из github
,
@northershoveler
Это расплывчатое объяснение и ИМХО неочевидно, @Sim Son
Смотрите также:
- Проблема с прерываниями
- Прерывание таймера срабатывает слишком часто
- Как убедиться, что импульсы ШИМ Arduino сдвинуты по фазе?
- Несколько независимых шаблонов светодиодов
- 4-битный счетчик вверх и вниз
- Прерывание при нажатии кнопки + устранение дребезга
- Светодиод Arduino PWM с замиранием в сборке
- AnalogWrite никогда не выводит ненулевое напряжение
Какой режим триггера установлен на вашем осциллографе?
Авто
илиНормально
?, @VE7JROРежим триггера был установлен на автоматический, я установил его на нормальный, я все еще вижу, как прямоугольная волна немного расширяется примерно на 1/10 секунды и повторяется каждые полсекунды. Я вижу то же самое на светильнике со светодиодом CREE XPE2. Он мерцает примерно так же, как мерцает осциллограф, когда мой потенциометр MCIGICM 10 кОм находится очень близко к тому месту, где я установил ноль. Мои кораллы и мои глаза полны благодарности за направление., @northershoveler