Вот тут, начиная с поста от 10 марта 2023:
https://radiokot.ru/forum/viewtopic.php ... 0&start=20
*
Не, того, для чего это надо, никто никогда не видел
Добавлено after 1 hour 33 minutes 10 seconds:
Впендюрил микрос, даже отключил чтение потенциометра и жёстко задал период - всё равно длительность полупериода дрыгается примерно в пределах 4-х мкс. Не понимяу.
Спойлер
Код: Выделить всё
// Set up potentiometer pin
#define POT_PIN A3
// Set up clock out pin
#define CLC_OUT 9
// Set up free pin (для ловли наводок)
#define FREE_PIN A1
// Set up random out pin (выход данных)
#define RANDOM_OUT 10
// Set up MFM out pin (выход МЧМ)
#define MFM_OUT 2
int RND = 0; // текущий бит данных
int RND_OLD = 0; // предыдущий бит данных
unsigned int POT = 20; // полпериода в микросекундах
int MFM = 0; // текущий бит МЧМ
unsigned int arr[100]; // массив случайных чисел
int i=0;
int j=0;
unsigned long time;
void setup() {
// put your setup code here, to run once:
// Set ADC mode
// Регистр настройки мультиплексора
ADMUX = 0b01000011; // 0B0100011 - опорное Uпит (первые 01), 10 bit (3-й 0), A3 (последние 0011)
// Регистр статуса и контроля
ADCSRA = 0b11110011; // CLK/8 - ускоряем АЦП - в 8 раз ниже частоты процессора (32/8=4МГц)
// Set up pins as input
pinMode(POT_PIN, INPUT);
pinMode(FREE_PIN, INPUT);
// Set up pins as outputs
pinMode(CLC_OUT, OUTPUT);
pinMode(RANDOM_OUT, OUTPUT);
pinMode(MFM_OUT, OUTPUT);
digitalWrite(MFM_OUT, MFM);
randomSeed(analogRead(FREE_PIN));
// для пинов 9 и 10 (таймер1) - для 10 кГц вроде не обязательно
// TCCR1A = 0b00000001; // 8bit
// TCCR1B = 0b00001001; // x1 fast pwm - 62.5 кГц - для UNO и 125 кГц - для LGT8F328P
time = micros();
}
// Main loop - put your main code here, to run repeatedly:
void loop() { // до 30 кГц без задержек на random и ускорением чтения потенциометра
for(i = 0; i < 100; i++){ // в массиве будет 100 элементов //
arr[i] = random(65536); // заполним массив случайными числами // Чтобы потом в цикле не вносить задержек
}
while(true){ // бесконечный цикл для основной программы
while(micros()-time < POT+10){
}
time = micros();
digitalWrite(CLC_OUT, HIGH); // переключаем СLC на HIGH - тактовая частота, желателен меандр
RND = bitRead(arr[i], j); // чтение битов массива
digitalWrite(RANDOM_OUT, RND); // вывод случайных данных на 10-й пин
if (RND < 1 && RND_OLD < 1) digitalWrite(MFM_OUT, !digitalRead(MFM_OUT)); // смена логического уровня МФМ в начале
// бита данных, если второй 0 подряд
j=j+1; //
if(j > 15) { // последовательное чтение
j = 0; // битов из массива
i=i+1; // (быстрее, чем random (2))
} //
if(i > 99) i = 0;
// POT = analogRead(POT_PIN); // чтение потенциометра
// POT = map(POT, 20, 1000, 1, 512); // масштабируем до диапазона 1 ... 512
// POT = constrain(POT, 1, 512); // ограничиваем диапазон, чтобы исключить выбросы
while(micros()-time < POT+10){
}
time = micros();
digitalWrite(CLC_OUT, LOW); // переключаем СLC на LOW - тактовая частота, желателен меандр
if (RND > 0) digitalWrite(MFM_OUT, !digitalRead(MFM_OUT)); // переход уровня МФМ при 1 данных по спаду CLC -
// в середине бита, т.е. CLC должен быть меандром
RND_OLD = RND;
// POT = analogRead(POT_PIN); //
// POT = map(POT, 20, 1000, 1, 512); // 25 мкс
// POT = constrain(POT, 1, 512); // поэтому пока отключил
} // закрыли while
} // закрыли loop
(Аль Котоне, кот ещё тот, Cattus Sapiens)Усы и хвост - мои документы.
Кот - авторитет! Скажет "Мяу!" - не поспоришь. (скажи мне "мяу" и я скажу кто ты)


