Доработать скетч
- Войдите на сайт для отправки комментариев
Ср, 28/12/2016 - 18:11
Доброго всем времени суток,
Нужно доработать код -
#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
точно 450 kHz? Дело в том, что, например, примененный в вашем коде оператор
digitalWrite(3, value);выполняется 6 мкс, итого на туда/ сюда 12 мкс (и макс 80 кГц) только на ногодрыг...
Пишите ydom@mail.ru напишу фрагмент кода генерации меандра на честном С или асме. Но нужно задействовать один таймер.
На ардуино не выполнимо, даже на прерываниях, сторонняя XR2206 она до 300Кгц, остаётся только прямой цифровой синтез, AD9850, AD9851
точно 450 kHz? Дело в том, что, например, примененный в вашем коде оператор
digitalWrite(3, value);выполняется 6 мкс, итого на туда/ сюда 12 мкс (и макс 80 кГц) только на ногодрыг...
Пишите ydom@mail.ru напишу фрагмент кода генерации меандра на честном С или асме. Но нужно задействовать один таймер.
меандр частотой 0-450Khz. частота должна изменяться линейно по значению input
PS то-есть точность перестройки частоты - 6.86656ГЦ
точно 450 kHz? Дело в том, что, например, примененный в вашем коде оператор
digitalWrite(3, value);выполняется 6 мкс, итого на туда/ сюда 12 мкс (и макс 80 кГц) только на ногодрыг...
Пишите ydom@mail.ru напишу фрагмент кода генерации меандра на честном С или асме. Но нужно задействовать один таймер.
Скажем так - во первых ошибся, а исправить не могу - не kHz а Hz. Во вторых не обязательно точно, но что то около того (сигналом будет крутиться автомобильный аналоговый спидометр, а там примерно от 0 до 450hz)
точно 450 kHz? Дело в том, что, например, примененный в вашем коде оператор
digitalWrite(3, value);выполняется 6 мкс, итого на туда/ сюда 12 мкс (и макс 80 кГц) только на ногодрыг...
Пишите ydom@mail.ru напишу фрагмент кода генерации меандра на честном С или асме. Но нужно задействовать один таймер.
Скажем так - во первых ошибся, а исправить не могу - не kHz а Hz. Во вторых не обязательно точно, но что то около того (сигналом будет крутиться автомобильный аналоговый спидометр, а там примерно от 0 до 450hz)
Ну тогда здесь нахрен честный СИ не нужен, всунуть код генератора на таймерах от DIMAX, для знающего работы на 15 минут
Скажем так - во первых ошибся, а исправить не могу - не kHz а Hz. Во вторых не обязательно точно, но что то около того (сигналом будет крутиться автомобильный аналоговый спидометр, а там примерно от 0 до 450hz)
а, ну другое дело. Письмо вам пишу, а вы в ответ точные требования по точности частоты. Если Hz, то конечно можно сделать побыстрее и подешевле, чем для 450 kHz... Ну или вы, не дожидаясь моего письма, пришлите требования (тз) ydom@mail.ru
Я этот генератор вчера ещё смотрел, но лично у меня глаза от кода разбежались в разные стороны. Потому и в платном разделе.
На какую точность всё же выходить 1Гц или 0.006867Гц?
1Гц вполне
Я этот генератор вчера ещё смотрел, но лично у меня глаза от кода разбежались в разные стороны. Потому и в платном разделе.
uint это 65535 значений, оно вам точно надо?
Я этот генератор вчера ещё смотрел, но лично у меня глаза от кода разбежались в разные стороны. Потому и в платном разделе.
есть малость )))
Этот 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
в принципе не особо, плясалось от того, что в can сообщении максимум FF FF
глянул сейчас, достаточно 54783
Этот DIMAX код вам помог бы
Возник вопрос - а возможно в этом коде перевесить выход с 9 на 3?
Этот DIMAX код вам помог бы
Возник вопрос - а возможно в этом коде перевесить выход с 9 на 3?
А в теме генератора и задайте, он ответит