Доработать скетч

treur
Offline
Зарегистрирован: 18.10.2015

Доброго всем времени суток,

Нужно доработать код -

#include <mcp_can.h>
#include <SPI.h>

unsigned char len = 0, rxBuf[8];
unsigned kbps = 0, value = LOW;
unsigned long rxId, input, freq = 0, previousMillis = 0;

MCP_CAN CAN(10);
void setup() {
  CAN.begin(CAN_500KBPS);

}

void loop() {
 canread();
      if (rxId == 0x37E && len == 7) {
        goto a39;
      }
a39:
  canread();
  if (rxId == 0x37E) {
    input =  uint16_t(rxBuf[0] << 8 | rxBuf[1] );
  }
  blink(input);
  goto a39;
}

void blink (unsigned int input)
{
  canread();
  if (input != 0)
  {
    freq = 65535 - input;

    if (millis() - previousMillis > freq) {
      previousMillis = millis();
      value = !value;
      digitalWrite(3, value);
    }
  }
  else if (input == 0)
  {
    digitalWrite(3, HIGH);
  }
}

void canread()
{
  CAN.readMsgBuf(&len, rxBuf);
  rxId = CAN.getCanId();
}

если точнее, то переписать функцию blink, на выходе D3 должен быть меандр частотой 0-450Khz. частота должна изменяться линейно по значению input.

Предложения/вопросы ICQ 99177868, ilja(а)treurtransport.eu

Onkel
Offline
Зарегистрирован: 22.02.2016

точно 450 kHz? Дело в том, что, например, примененный в вашем коде оператор  digitalWrite(3, value);

выполняется 6 мкс, итого на туда/  сюда 12 мкс (и макс 80 кГц) только на ногодрыг...

Пишите ydom@mail.ru  напишу фрагмент кода генерации меандра на честном С или асме. Но нужно задействовать один таймер.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

На ардуино не выполнимо, даже на прерываниях, сторонняя XR2206 она до 300Кгц, остаётся только прямой цифровой синтез, AD9850, AD9851

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Onkel пишет:

точно 450 kHz? Дело в том, что, например, примененный в вашем коде оператор  digitalWrite(3, value);

выполняется 6 мкс, итого на туда/  сюда 12 мкс (и макс 80 кГц) только на ногодрыг...

Пишите ydom@mail.ru  напишу фрагмент кода генерации меандра на честном С или асме. Но нужно задействовать один таймер.

меандр частотой 0-450Khz. частота должна изменяться линейно по значению input
PS то-есть точность перестройки частоты - 6.86656ГЦ

treur
Offline
Зарегистрирован: 18.10.2015

Onkel пишет:

точно 450 kHz? Дело в том, что, например, примененный в вашем коде оператор  digitalWrite(3, value);

выполняется 6 мкс, итого на туда/  сюда 12 мкс (и макс 80 кГц) только на ногодрыг...

Пишите ydom@mail.ru  напишу фрагмент кода генерации меандра на честном С или асме. Но нужно задействовать один таймер.

Скажем так - во первых ошибся, а исправить не могу - не kHz а Hz. Во вторых не обязательно точно, но что то около того (сигналом будет крутиться автомобильный аналоговый спидометр, а там примерно от 0 до 450hz)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

treur пишет:

Onkel пишет:

точно 450 kHz? Дело в том, что, например, примененный в вашем коде оператор  digitalWrite(3, value);

выполняется 6 мкс, итого на туда/  сюда 12 мкс (и макс 80 кГц) только на ногодрыг...

Пишите ydom@mail.ru  напишу фрагмент кода генерации меандра на честном С или асме. Но нужно задействовать один таймер.

Скажем так - во первых ошибся, а исправить не могу - не kHz а Hz. Во вторых не обязательно точно, но что то около того (сигналом будет крутиться автомобильный аналоговый спидометр, а там примерно от 0 до 450hz)

Ну тогда здесь нахрен честный СИ не нужен, всунуть код генератора на таймерах от DIMAX, для знающего работы на 15 минут

Onkel
Offline
Зарегистрирован: 22.02.2016

treur пишет:

Скажем так - во первых ошибся, а исправить не могу - не kHz а Hz. Во вторых не обязательно точно, но что то около того (сигналом будет крутиться автомобильный аналоговый спидометр, а там примерно от 0 до 450hz)

а, ну другое дело. Письмо вам пишу, а вы в ответ точные требования по точности частоты. Если Hz, то конечно можно сделать побыстрее и подешевле, чем для 450 kHz... Ну или вы, не дожидаясь моего письма, пришлите требования (тз) ydom@mail.ru

treur
Offline
Зарегистрирован: 18.10.2015

Я этот генератор вчера ещё смотрел, но лично у меня глаза от кода разбежались в разные стороны. Потому и в платном разделе.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

На какую точность всё же выходить 1Гц или 0.006867Гц?

treur
Offline
Зарегистрирован: 18.10.2015

1Гц вполне

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

treur пишет:

Я этот генератор вчера ещё смотрел, но лично у меня глаза от кода разбежались в разные стороны. Потому и в платном разделе.

uint это 65535 значений, оно вам точно надо?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

treur пишет:

Я этот генератор вчера ещё смотрел, но лично у меня глаза от кода разбежались в разные стороны. Потому и в платном разделе.

есть малость )))

Этот DIMAX код вам помог бы

void setup() {
Serial.begin(9600);
pinMode (9,OUTPUT); // выход генератора
TCCR1A=1<<COM1A0; //подключить выход OC1A первого таймера
TCCR1B=0;//
}
void loop() {
static uint32_t enc=1; //переменная счёта энкодера
uint32_t ocr; uint32_t divider; float freq; 
if (Serial.available() > 0){
    enc = Serial.parseInt(); 
  //расчёт прескалера и OCR по нужной частоте
   divider=1; ocr = (F_CPU / enc /2 /divider);
   if (ocr >65536) { divider=8; ocr = F_CPU / enc /2 /divider;
       if (ocr >65536) { divider=64; ocr = F_CPU / enc /2 /divider;
           if (ocr >65536)  {divider=256; ocr = F_CPU / enc /2 /divider;
               if (ocr >65536) { divider=1024; ocr = F_CPU / enc /2 /divider;
                   if (ocr >65536){ocr=65536; }}}}} OCR1A=ocr-1; 
  //запись в регистр прескалера            
   switch (divider) {
     case 1: TCCR1B=1|(1<<WGM12); break;
      case 8: TCCR1B=2|(1<<WGM12); break;
       case 64: TCCR1B=3|(1<<WGM12); break;
        case 256: TCCR1B=4|(1<<WGM12); break;
         case 1024: TCCR1B=5|(1<<WGM12); break;  }
         
       freq= (float) F_CPU/2 / (OCR1A+1) /divider;
      if (freq <10000) { Serial.print(freq,1);Serial.println(" Hz "); }
      if (freq >10000) { Serial.print(freq/1000,3);Serial.println(" kHz");}
      } //end if serial..
} //end void loop

Строка 11 это для получения от input

 

treur
Offline
Зарегистрирован: 18.10.2015

в принципе не особо, плясалось от того, что в can сообщении максимум FF FF

глянул сейчас, достаточно 54783

treur
Offline
Зарегистрирован: 18.10.2015

ua6em пишет:

Этот DIMAX код вам помог бы

Возник вопрос - а возможно в этом коде перевесить выход с 9 на 3?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

treur пишет:

ua6em пишет:

Этот DIMAX код вам помог бы

Возник вопрос - а возможно в этом коде перевесить выход с 9 на 3?

А в теме генератора и задайте, он ответит