Эмуляция сигнала ДПКВ 60-2

@Diagnost , куда пропал то? Всё совсем плохо?)

Приветствую. Не работает со скетчем с поста №116. Осциллографом проверяю импульсы отличные. Сравнил их с рабочим скетчем с поста №16 .Импульсы один в один, но не хотят блоки с ним работать. Не понятно.

обороты разные пробовали?

1 лайк

замерил лог анализатором

этот скетч и ниже скетч как из поста #16 , только убран опрос потенциометра, на оборотах 1000 имеют абсолютно одинаковую картинку. Повторите тест внимательнее, вдруг где то неконтакт, или что-то не то загрузили.

#define wheel_len   60   // количество зубов сигнала дпкв 
#define tooth_len   3    // количество  градусов поворота кв зуба
#define hole_len    3    // количество  градусов поворота кв впадины

//    зуб+впадина = 360/количество зубов (проверяем это) !!! иначе скетч не скомпилируется 

#if ((tooth_len+hole_len) != 360/wheel_len)  
#error "Ошибка! неправильно задано количество зубов и/или размер зуба и впадины"  
#endif  

#define pt_pin      A0
#define timeout     500

uint32_t RPM = 1000;        //rpm
uint32_t pt, mill;
volatile uint8_t index = 0;

// ниже составляем таблицу зубов и впадин как хотим , делаем пропущенные зубья и/или впадины где надо. 
 
const bool Table_CKP[] = {
// зуб 1     2     3     4     5     6     7     8     9     10    11    12   
       1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
       
// зуб 13    14    15    16    17    18    19    20    21    22    23    24          
       1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,

// зуб 25    26    27    28    29    30    31    32    33    34    35    36                 
       1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,

// зуб 37    38    39    40    41    42    43    44    45    46    47    48          
       1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,

// зуб 49    50    51    52    53    54    55    56    57    58    59    60                 
       1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1 
};

// Check the size here:
static_assert(sizeof(Table_CKP) == wheel_len*2, "Ошибка! неправильно задано количество ячеек зубов и впадин в массиве (таблице)");

void setup() {

  DDRD |= (1 << PD2);
  DDRD |= (1 << PD3);

  PORTD &= ~(1 << PD2);
  PORTD &= ~(1 << PD3);

 //ниже настраиваем аппаратный таймер ардуино
  TCCR1A = 0;   
  TCCR1B = 8;
  TCCR1B |= 1;
  OCR1A = 2666666ul/RPM;  
  TIMSK1 |= (1<<OCIE1A);
  
//  pt = analogRead(pt_pin);
//  RPM = map(pt, 0, 1024, 300, 5500);
// Глобально разрешаем прерывания
sei();
}



void loop() {

  if (millis() - mill > timeout) 
   {
     mill = millis();
   // pt = analogRead(pt_pin);
   // RPM = map(pt, 0, 1024, 300, 5500); 
      OCR1A = 2666666ul/RPM;  
   }
}

ISR(TIMER1_COMPA_vect) { //сюда заходит раз в 1 градус поворота кв
static bool tooth = 1; 

  if (Table_CKP[index] == 0) {
    PORTD &= ~(1 << PD2);
    PORTD |= (1 << PD3);
  } else {
    PORTD |= (1 << PD2);
    PORTD &= ~(1 << PD3);
  }
static byte index_gradus  = 0 ; 
if (++index_gradus >= ((tooth==1) ? tooth_len : hole_len)) 
    {
     tooth=!tooth; 
     index_gradus = 0 ;
     if (++index >= wheel_len*2) {index = 0;}
    }
  
}

скетч из поста 16

#define wheel_len   240
#define pt_pin      A0
#define out1_pin    2
#define out2_pin    3

uint32_t tick_delay, mill;
uint32_t FREQ = 1000;        //rpm
uint32_t pt;

const char Table1[wheel_len] = {
  0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
};

void setup() {

  pinMode(out1_pin, OUTPUT);
  pinMode(out2_pin, OUTPUT);

  pt = analogRead(pt_pin);

 // FREQ = map(pt, 0, 1024, 300, 5500);

  tick_delay = ((120000000UL / FREQ) / wheel_len);
  mill = millis();
}

void loop() {

  for (uint8_t i = 0; i < wheel_len; i++) {
    digitalWrite(out1_pin, Table1[i]);
    digitalWrite(out2_pin, !Table1[i]);
    //    digitalWrite(out3_pin, !Table2[i]);
    delayMicroseconds(tick_delay);
  }

//  if (millis() - mill > 1000) {

//    mill = millis();
   // pt = analogRead(pt_pin);

  //  FREQ = map(pt, 0, 1024, 300, 5500);

//    tick_delay = ((120000000UL / FREQ) / wheel_len);
//  }
}
1 лайк

MaksVV, пробовал разные обороты. С №16 поста работает, с № 116 не работает. Осциллографом то же проверял(во время подключения к блокам), сигналы одинаковые. Вижу, что сигналы в вашем скетче с BOOM красивые, но может я что то не так делаю. Сегодня последний раз попробую. Спасибо за помощь.

Попробуй из поста 144 оба скетча . И если увидел кривость сигнала , нужен скрин, чтобы понять в чем дело (обороты можно в них задавать в начале скетча в переменой . FREQ)

А вы не задумывались - Почему изначальный скетч написан именно для 900 оборотов?

Приветствую. Какая то непонятная история получилась. Но последние скетчи не работают, хотя генертруют хорошие импульсы. Проблему удалось решить, записав в одну ардуино рабочий скетч с поста №16 ( с регулировкой оборотов потенциометром, но без тм 1637), а во вторую скетч с поста №116 ( уже с тм1637). Один потенциометр подключил одновременно к двум ардуинкам (вывод А0). Одна генерирует нормальные импульсы, а вторая отображает обороты. Отдельное спасибо BOOM и MaksVV.:+1: