KJloyH, речь про частотометр из #41? Я позже пробовал, но нужных аппаратных меж- таймерных связей не нашёл. Можно программными способами, но это испортит всю малину..
Пока не очень хорошо разобрался в TC но всё же подразумеваю что это возможно если не сложно даташит 901 страница там вроде есть но так как не очень разобрался могу ошибаться. Вашу программу разобрал досконально много чего понял, но не все спасибо.
Доброго времени суток.
Который день ковыряюсь в описании DUE, пытаюсь код из поста 33, тот, что просто даёт синус на выход DAC, синхронизировать с PWM- меандриком. Нужно в идеале сделать ждущий мультивибратор, чтобы при появлении на ноге PWM высокого уровня, DAC0 выдал один целый период синуса, и снова ожидал. Отдельно всё разбегается.
В книжке написано, что ЦАП может работать от внешнего триггера, а для PWM-a eсть Event Line x Register, а вот как скрестить ужа с ежом мне неведомо. Кто-нибудь знает, как это работает?
Alex_1978, данный метод синтеза DDS не подходит для вашей задачи. Нужно выталкивать каждый семпл из массива под такты таймера. Тогда синхронизация от внешнего сигнала возможна.
dimax, большое спасибо вам за совет. Сделал меандры с использованием штатного PWM и выталкиванием массива синуса под такты таймера.
Задачка была под 50гц, выставил раз каналы и забыл, и чтоб ничего не плавало относительно друг друга. Таймер 500кГц, 2мкс., циклично прогоняется целый период синуса, массив на 10.000 элементов.
Относительные смещения каналов написаны топорненько, но главное что все заработало, и выставить можно очень точно.
Итого, 4шт. 50Гц PWM меандра c регулируемой скважностью и взаимным смещением, и синус 50Гц на ноге DAC0, может кому пригодится.
#include <pwm_lib.h>
#include <DueTimer.h>
using namespace arduino_due::pwm_lib;
int sine_long_arr = 10000;
uint16_t* sine_wave = new uint16_t[sine_long_arr];
Sencis ,
В принципе с соответствующей переделкой скетча можно посадить на любые свободные TIO* ноги. Я просто взял "первые с краю" ;)
По вашему частотометру получилось сделать тахометр на ДВС от авимодели. Едиственное контакт А5 не подтянут к земле пришлось колхозить.
Хотел попробовать программу генератор DDS, и похоже загубил DAC0 (случайно замкнул выход). DAC1 работает.
Как можно переназначить выход на DAC1 ?. Я пробовал так, но увы, не заработало. В этих регистрах пока совсем не разбираюсь
REG_PIOB_OER|=1<<16;
//PB16 будет выход
REG_PIOB_PDR|=1<<16;
//PB16 будет периферия
Сделал так, заработало на DAC1, хотя код стал менее красивым ). Синус довольно неплох, по гармоникам 0.02%
Любопытно, что представленный здесь генератор синуса с использованием ДМА, обладает немного худшими качественными характеристиками
Доброе время суток. А разве нету возможность сконфигурировать так чтобы не поять внешею перемычку между пинами? Спасибо.
KJloyH, речь про частотометр из #41? Я позже пробовал, но нужных аппаратных меж- таймерных связей не нашёл. Можно программными способами, но это испортит всю малину..
Пока не очень хорошо разобрался в TC но всё же подразумеваю что это возможно если не сложно даташит 901 страница там вроде есть но так как не очень разобрался могу ошибаться. Вашу программу разобрал досконально много чего понял, но не все спасибо.
Доброго времени суток.
Который день ковыряюсь в описании DUE, пытаюсь код из поста 33, тот, что просто даёт синус на выход DAC, синхронизировать с PWM- меандриком. Нужно в идеале сделать ждущий мультивибратор, чтобы при появлении на ноге PWM высокого уровня, DAC0 выдал один целый период синуса, и снова ожидал. Отдельно всё разбегается.
В книжке написано, что ЦАП может работать от внешнего триггера, а для PWM-a eсть Event Line x Register, а вот как скрестить ужа с ежом мне неведомо. Кто-нибудь знает, как это работает?
#define freq 20.000 // требуемая частота в герцах
uint32_t shag= freq * 2761.069715582566; // попугаев на Герц
uint16_t sine_wave[16384]; uint32_t datatemp, akkum;
void setup(){
for(uint16_t n=0; n<16384; n++){sine_wave[n]=4095*(sin(TWO_PI*float(n)/16384)+1)/2 ;}
REG_PIOB_OER|=1<<15; //PB15 будет выход
REG_PIOB_PDR|=1<<15;//PB15 будет периферия
REG_PMC_PCER1|=1<<6; //включить тактирование "DACC"
REG_DACC_CR=1; //dacc reset;
REG_DACC_MR=1<<21;//maxspeed
REG_DACC_CHER=1; //channel 0 enable
__disable_irq();
while(1){
datatemp= sine_wave[(akkum+=shag)>>18];
if(REG_DACC_ISR&1==1){ REG_DACC_CDR=datatemp;}
}
}
void loop(){}
Это бы подправить...
Alex_1978, данный метод синтеза DDS не подходит для вашей задачи. Нужно выталкивать каждый семпл из массива под такты таймера. Тогда синхронизация от внешнего сигнала возможна.