Генератор с регулируемой частотой на Arduino Due.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Sencis ,

В принципе с соответствующей переделкой скетча можно посадить на любые свободные TIO* ноги. Я просто взял "первые с краю" ;)

Instance Signal PIO Line Peripheral Arduino pin
TC0 TIOA0 PB25 B 2
TC0 TIOA1 PA2 A A7
TC0 TIOA2 PA5 A -
TC0 TIOB0 PB27 B 13
TC0 TIOB1 PA3 A A6
TC0 TIOB2 PA6 A A4
TC2 TIOA6 PC25 B 5
TC2 TIOA7 PC28 B 3
TC2 TIOA8 PD7 B 11
TC2 TIOB6 PC26 B 4
TC2 TIOB7 PC29 B 10
TC2 TIOB8 PD8 B 12

 

Sencis
Offline
Зарегистрирован: 26.01.2018

По вашему частотометру получилось сделать тахометр на ДВС от авимодели. Едиственное контакт А5 не подтянут к земле пришлось колхозить.

marth
Offline
Зарегистрирован: 24.09.2019

Хотел попробовать программу генератор DDS, и похоже загубил DAC0 (случайно замкнул выход). DAC1 работает.

Как можно переназначить выход на DAC1 ?. Я пробовал так, но увы, не заработало. В этих регистрах пока совсем не разбираюсь 

 

REG_PIOB_OER|=1<<16; //PB16 будет выход
   REG_PIOB_PDR|=1<<16;//PB16 будет периферия

 

Сделал так, заработало на DAC1, хотя код стал менее красивым ). Синус довольно неплох, по гармоникам 0.02%

#define freq 1000.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<<16; //PB16 будет выход
 REG_PIOB_PDR|=1<<16;//PB16 будет периферия
   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
      DACC->DACC_CR = DACC_CR_SWRST ;           // Reset DACC
      DACC->DACC_MR = DACC_MR_TRGEN_DIS         // Hardware trigger disable, Free Run mode                
                  | DACC_MR_USER_SEL_CHANNEL1   // select channel 1
                  | DACC_MR_REFRESH (1)
                  | DACC_MR_STARTUP_8
                  | DACC_MR_MAXS;
      DACC->DACC_CHER = DACC_CHER_CH1; // enable channel 1 = DAC1
      
      __disable_irq();
         while(1){
      datatemp= sine_wave[(akkum+=shag)>>18];
    if(REG_DACC_ISR&1==1){ REG_DACC_CDR=datatemp;}  
  }
}
void loop(){}

 

 

marth
Offline
Зарегистрирован: 24.09.2019

Любопытно, что представленный здесь генератор синуса  с использованием ДМА, обладает немного худшими качественными характеристиками

KJloyH
Offline
Зарегистрирован: 21.03.2020

Доброе время суток. А разве нету возможность сконфигурировать так чтобы не поять внешею перемычку между пинами? Спасибо.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

KJloyH, речь про частотометр из #41? Я позже пробовал, но нужных аппаратных меж- таймерных связей не нашёл.  Можно программными способами, но это испортит всю малину..

KJloyH
Offline
Зарегистрирован: 21.03.2020

Пока не очень хорошо разобрался в TC но всё же подразумеваю что это возможно если не сложно даташит 901 страница там вроде есть но так как не очень разобрался могу ошибаться. Вашу программу разобрал досконально много чего понял, но не все спасибо.