Перейти к содержимому

Фотография

Переходник с аналогового радара в цифровой формат.


Сообщений в теме: 66

#26 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 15 683 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 15 марта 2020 - 14:09

/*********************************************************************
 Various Maple tests.. including timer capture to memory via dma =)
 ╨▓╨║╨╗╤Ä╤ç╨░╤Å ╨╖╨░╤à╨▓╨░╤é ╤é╨░╨╣╨╝╨╡╤Ç╨░ ╨▓ ╨┐╨░╨╝╤Å╤é╤î ╤ç╨╡╤Ç╨╡╨╖ dma
 */

#include "usb.h"
#include "timer.h"
#include "dma.h"
int PRESCALE=1 ;  //32   ; //128;
int WAIT=1 ; //50;
int g=0 ;
int k=0 ;
int j=0 ;
int TRIGGER=26 ;
int BEAM=25 ;
int PULSE=27 ;
float RANGE=9 ; // range us
//quick method to return if there's anyone on the other end of the serialusb link yet.
boolean isConnected(){
  return (SerialUSB.isConnected() && (SerialUSB.getDTR() || SerialUSB.getRTS()));
}

void setup(){
  SerialUSB.begin();
  while(!isConnected()); //wait till console attaches.
  SerialUSB.println("Hello!");
   SerialUSB.print(" Prescale: ");
      SerialUSB.println(PRESCALE);
      pinMode(27,INPUT_PULLDOWN);
      //pinMode(26, INPUT_PULLUP);
      pinMode(TRIGGER, INPUT_PULLDOWN);
      pinMode(BEAM, INPUT);
   
}

/**********************************************************************
 timer tests.. seeing if the timer clock really does run at 72mhz..
 */

volatile int overflowCount=0;
void countOverflows(){
  overflowCount++;
}

//int PRESCALE=8 ;  //32   ; //128;
//int WAIT=50;
int results[16];
int overflow[16];
void testHardwareTimer(HardwareTimer t){
  t.attachInterrupt(1,countOverflows);
  for(int i=0; i<16; i++){
    t.setCount(0);
    overflowCount=0;
    t.resume();
   delayMicroseconds(WAIT); // delay(WAIT);
    t.pause();
    results[i]=t.getCount();
    overflow[i]=overflowCount;
  }
  t.detachInterrupt(1);
}
void printResults(){ 
  SerialUSB.print("Timing results: ");
  for(int i=0; i<16; i++){
    SerialUSB.print(results[i]);
    SerialUSB.print(" ");
  }
  SerialUSB.println();
  SerialUSB.print("Overflows: ");
  for(int i=0; i<16; i++){
    SerialUSB.print(overflow[i]);
    SerialUSB.print(" ");
  }
  SerialUSB.println();
  SerialUSB.print("Each count worth approx (ns): ");
  for(int i=0; i<16; i++){
    SerialUSB.print( waitToNanos(overflow[i], results[i]) );
    SerialUSB.print(" ");
  }
  SerialUSB.println();
}
double expectedTimePeriod(){
  //in nanos.. so 72mhz = 72000khz = 72000000hz  1/72000000hz = tick in seconds
  // 1/72000 = tick in ms, 1/72 = tick in us (1/72) * 1000 = tick in ns
  //tick in ns * prescale == time ╨║╨╛╤é╨╛╤Ç╨╛╨╡ ╨╝╤ï ╨┤╨╛╨╗╨╢╨╜╤ï ╨▓╨╕╨┤╨╡╤é╤î
//we're supposed to see
  return ((double)1.0 / ((double)72.0)) * (double)1000.0 * (double)PRESCALE;
}
double waitToNanos( int overflows, int count ){
  //wait is in millis, *1000 for micros, *1000 for nanos
  double time = (((double)WAIT * (double)1000.0))  ; // * (double)1000.0) ) ;
  time = time / ((double)count + ((double)65535*(double)overflows));
  return time;
}

int readInt(char terminator){
  char current;
  int output=0;
  while(SerialUSB.available() && (current=SerialUSB.read())!=terminator){
    if(current>='0' && current<='9'){
      output=output*10;
      output+=(current-'0');
    }else{
      output=-1;
      break;
    }
  }
  return output;
}

HardwareTimer timer2 = HardwareTimer(2);
HardwareTimer timer1 = HardwareTimer(1);
void timingTest(){
      SerialUSB.println("Starting Timing test");
      SerialUSB.print(" Prescale: ");
      SerialUSB.println(PRESCALE);
      SerialUSB.print(" Wait Period (us): ");
      SerialUSB.println(WAIT);
      SerialUSB.print(" Expected value for each tick :");
      SerialUSB.println(expectedTimePeriod());
      timer1.pause();
      timer2.pause();

      timer2.setMode(TIMER_CH1, TIMER_OUTPUT_COMPARE);
      timer2.setPrescaleFactor(PRESCALE);
      timer2.setOverflow(65535);
      timer2.setCompare(1,65535);
      timer2.setCount(0);
      timer2.refresh();

      timer1.setMode(TIMER_CH1, TIMER_OUTPUT_COMPARE);
      timer1.setPrescaleFactor(PRESCALE);
      timer1.setOverflow(65535);
      timer1.setCompare(1,65535);
      timer1.setCount(0);
      timer1.refresh();

      testHardwareTimer(timer1);
      printResults();

      testHardwareTimer(timer2);
      printResults();        
}

/******************************************************************************
 DMA from Timer Capture to array test..
 */

//number of captures to do..
#define TIMERS 100  //512
volatile int exit=0;            //set to 1 when dma complete.
volatile uint16 data[TIMERS];   //place to put the data via dma

//dump routine to show content of captured data.
void printData(){
  SerialUSB.print("DATA: ");
  for(int i=0; i<TIMERS; i++){
    SerialUSB.print(data[i]);
    SerialUSB.print(" ");
  }
  SerialUSB.println();
}

//активизировать (invoked) as configured by the DMA mode flags.
void dma_isr()
{
    dma_irq_cause cause = dma_get_irq_cause(DMA1, DMA_CH2);
        //using serialusb to print messages here is nice, but
        //it takes so long, we may never exit this isr invocation
        //before the next one comes in.. (dma is fast.. m'kay)
    switch(cause)
    {
        case DMA_TRANSFER_COMPLETE:
            // Transfer completed
                        SerialUSB.println("DMA Complete");
                        exit=1;
            break;
        case DMA_TRANSFER_HALF_COMPLETE:
            // Transfer is half complete
                        SerialUSB.println("DMA Half Complete");                 
            break;
        case DMA_TRANSFER_ERROR:
            // An error occurred during transfer
                        SerialUSB.println("DMA Error");
                        exit=1;
            break;
        default:
            // Something went horribly wrong.
            // Should never happen.
                        SerialUSB.println("DMA WTF");
                        exit=1;
            break;
    }

}


void loop(){
 
  //simple main loop, listens for a char, and uses it as a command
  //to select what task to perform
  //
  // a   echo test
  // b   echo test
  // c   serialusb disable/enable test
  // d   time the timer test, default params
  // e   time the timer test, user supplied args
  // f   DMA timer capture of pulse widths from D6 straight to memory
 
  while(!SerialUSB.available());
  char cmd = SerialUSB.read();
  switch(cmd)
  {
  case 'a':
    {
      SerialUSB.println("Hello");
      break;
    }
  case 'b':
    {
      SerialUSB.println("There");
      break;
    }

  case 'c':
    {
      SerialUSB.println("Going away for a while");
      SerialUSB.end();
      usbPowerOff();
      delay(5000);
      usbPowerOn();
      SerialUSB.begin();
      delay(5000);
      while(!isConnected());
      SerialUSB.println("Welcome back");
      break;
    }
  case 'd':
    {
      // WAIT=50;
      // PRESCALE=128;
       timingTest();        printData();
       break;
    }
     case 'p':
    {
      printData();
       break;
    }
    case 'i':
    {
    //  attachInterrupt(26, blink, RISING);
      attachInterrupt(TRIGGER, TRIGGER_ON, FALLING);
     // printData();
       break;
    }
    case 'e':
    {
      int arg1=0;
      int arg2=0;
     
      if(!SerialUSB.available())
        goto usage;
      if(SerialUSB.read()!=' ')
        goto usage;
       
      arg1 = readInt(' ');
      arg2 = readInt(' ');
     
      if(arg1==-1 || arg2==-1)
        goto usage;
     
      SerialUSB.print("Setting prescale to: ");
      SerialUSB.println(arg1);
      SerialUSB.print("Setting wait to: ");
      SerialUSB.println(arg2);
     
      WAIT=arg2;
      PRESCALE=arg1;
      timingTest();
       
      goto done;
usage:
      SerialUSB.println("Usage: e <prescale> <wait>");
      SerialUSB.println(" eg. e 128 200   for a prescale of 128 and wait of 200");
done:
      break;
    }
    case 'f':{     
      timer_dev *t = TIMER1;
     
      timer1.pause();
      timer1.setPrescaleFactor(PRESCALE)  ;  //128);
      timer1.setOverflow(65535);
      timer1.setCount(0);
      timer1.refresh();
     
      timer_reg_map r = t->regs;
     
      //using timer1, channel1, maps to pin d27
      //according to maple master pin map.
    //  pinMode(27,INPUT_PULLUP);
     
      //capture compare regs TIMx_CCRx used to hold val after a transition on corresponding ICx
     
      //when cap occurs, flag CCXIF (TIMx_SR register) is set,
      //and interrupt, or dma req can be sent if they are enabled.
     
      //if cap occurs while flag is already high CCxOF (overcapture) flag is set..
     
      //CCIX can be cleared by writing 0, or by reading the capped data from TIMx_CCRx
      //CCxOF is cleared by writing 0 to it.
     
      //Capture/Compare 1 Selection
      //  set CC1S bits to 01 in the capture compare mode register.
      //  01 selects TI1 as the input to use. (page 336 stm32 reference)
      //  (assuming here that TI1 is D6, according to maple master pin map)
      //CC1S bits are bits 0,1
      bitSet(r.adv->CCMR1, 0);
      bitClear(r.adv->CCMR1, 1);

     
      //Input Capture 1 Filter.
      //  need to set IC1F bits according to a table saying how long
      //  we should wait for a signal to be 'stable' to validate a transition
      //  on the input.
      //  (page 336 stm32 reference)
      //IC1F bits are bits 7,6,5,4   
      bitClear(r.adv->CCMR1, 7);                       
      bitClear(r.adv->CCMR1, 6); 
      bitSet(r.adv->CCMR1, 5); 
      bitSet(r.adv->CCMR1, 4); 
     
      //sort out the input capture prescaler..
      //00 no prescaler.. capture is done as soon as edge is detected
      bitClear(r.adv->CCMR1, 3);                       
      bitClear(r.adv->CCMR1, 2); 

      //select the edge for the transition on TI1 channel using CC1P in CCER
      //CC1P is bit 1 of CCER (page 339)
      // 0 = falling
      // 1 = rising
      bitClear(r.adv->CCER,1);
     
      //set the CC1E bit to enable capture from the counter.
      //CCE1 is bit 0 of CCER (page 339)
      bitSet(r.adv->CCER,0);

      //enable dma for this timer..
      //sets the Capture/Compare 1 DMA request enable bit on the DMA/interrupt enable register.
      //bit 9 is CC1DE as defined on page 329.
      bitSet(r.adv->DIER,9);     
     
      dma_init(DMA1);
      dma_setup_transfer( DMA1,    //dma device, dma1 here because that's the only one we have
                          DMA_CH2, //dma channel, channel2, because it looks after tim1_ch1 (timer1, channel1)
                          &(r.adv->CCR1), //peripheral address
                          DMA_SIZE_16BITS, //peripheral size
                          data, //memory address
                          DMA_SIZE_16BITS, //memory transfer size
                          (0
                           //| DMA_FROM_MEM  //set if going from memory, don't set if going to memory.
                           | DMA_MINC_MODE //auto inc where the data does in memory (uses size_16bits to know how much)
                           | DMA_TRNS_ERR  //tell me if it's fubar
                           //| DMA_HALF_TRNS //tell me half way (actually, don't as I spend so long there, I dont see 'complete')                         
                           | DMA_TRNS_CMPLT //tell me at the end
                           ) 
                          );
                                                   
      fff() ;
        printData();
      break;
     }
     case 's':{  
     pinMode(27,INPUT_PULLUP);  
         for(g=0 ;g<4 ;g++){
      timer_dev *t = TIMER1;
     
      timer1.pause();
      timer1.setPrescaleFactor(PRESCALE)  ;  //128);
      timer1.setOverflow(65535);
      timer1.setCount(0);
      timer1.refresh();
     
      timer_reg_map r = t->regs;
   
      
      //using timer1, channel1, maps to pin d27
      //according to maple master pin map.
    
     
      //capture compare regs TIMx_CCRx used to hold val after a transition on corresponding ICx
     
      //when cap occurs, flag CCXIF (TIMx_SR register) is set,
      //and interrupt, or dma req can be sent if they are enabled.
     
      //if cap occurs while flag is already high CCxOF (overcapture) flag is set..
     
      //CCIX can be cleared by writing 0, or by reading the capped data from TIMx_CCRx
      //CCxOF is cleared by writing 0 to it.
     
      //Capture/Compare 1 Selection
      //  set CC1S bits to 01 in the capture compare mode register.
      //  01 selects TI1 as the input to use. (page 336 stm32 reference)
      //  (assuming here that TI1 is D6, according to maple master pin map)
      //CC1S bits are bits 0,1
      bitSet(r.adv->CCMR1, 0);
      bitClear(r.adv->CCMR1, 1);

     
      //Input Capture 1 Filter.
      //  need to set IC1F bits according to a table saying how long
      //  we should wait for a signal to be 'stable' to validate a transition
      //  on the input.
      //  (page 336 stm32 reference)
      //IC1F bits are bits 7,6,5,4   
      bitClear(r.adv->CCMR1, 7);                       
      bitClear(r.adv->CCMR1, 6); 
      bitSet(r.adv->CCMR1, 5); 
      bitSet(r.adv->CCMR1, 4); 
     
      //sort out the input capture prescaler..
      //00 no prescaler.. capture is done as soon as edge is detected
      bitClear(r.adv->CCMR1, 3);                       
      bitClear(r.adv->CCMR1, 2); 

      //select the edge for the transition on TI1 channel using CC1P in CCER
      //CC1P is bit 1 of CCER (page 339)
      // 0 = falling
      // 1 = rising
      bitClear(r.adv->CCER,1);
     
      //set the CC1E bit to enable capture from the counter.
      //CCE1 is bit 0 of CCER (page 339)
      bitSet(r.adv->CCER,0);

      //enable dma for this timer..
      //sets the Capture/Compare 1 DMA request enable bit on the DMA/interrupt enable register.
      //bit 9 is CC1DE as defined on page 329.
      bitSet(r.adv->DIER,9);     
     
      dma_init(DMA1);
      dma_setup_transfer( DMA1,    //dma device, dma1 here because that's the only one we have
                          DMA_CH2, //dma channel, channel2, because it looks after tim1_ch1 (timer1, channel1)
                          &(r.adv->CCR1), //peripheral address
                          DMA_SIZE_16BITS, //peripheral size
                          data, //memory address
                          DMA_SIZE_16BITS, //memory transfer size
                          (0
                           //| DMA_FROM_MEM  //set if going from memory, don't set if going to memory.
                           | DMA_MINC_MODE //auto inc where the data does in memory (uses size_16bits to know how much)
                           | DMA_TRNS_ERR  //tell me if it's fubar
                           //| DMA_HALF_TRNS //tell me half way (actually, don't as I spend so long there, I dont see 'complete')                         
                           | DMA_TRNS_CMPLT //tell me at the end
                           ) 
                          );
                                                   
     fff() ;
       }    //for
        printData();
      break;
     }  
  }
}
void fff() {
  dma_attach_interrupt(DMA1, DMA_CH2, dma_isr); //hook up an isr for the dma chan to tell us if things happen.
      dma_set_num_transfers(DMA1, DMA_CH2, TIMERS); //only allow it to transfer TIMERS number of times.   
      dma_enable(DMA1, DMA_CH2);                    //enable it..
            timer1.resume();
    
     // while(!exit);
     delayMicroseconds(RANGE) ;
    // exit=1;
 //    detachInterrupt(PULSE) ;
    
   //  timer1.pause();
      dma_disable(DMA1, DMA_CH2);
      dma_detach_interrupt(DMA1, DMA_CH2);
      // printData();
      detachInterrupt(BEAM) ;
      printData();
      j=j+1 ;
      SerialUSB.print("j=");SerialUSB.println(j);
      ////////////////////////////////////
     
     DMA_RET () ;
      attachInterrupt(BEAM, BEAM_ON , RISING);
     
}
//void blink(){
 // attachInterrupt(PULSE, ....., FALLING);
  //detachInterrupt(BEAM) ;
  // delay(2) ;
//  fff() ;
//}
void TRIGGER_ON(){
  DMA_FT () ;
  attachInterrupt(BEAM, fff , RISING);
 
//    detachInterrupt(TRIGGER) ;
//    attachInterrupt(TRIGGER, NEXT_ROT, FALLING);
  k=k+1 ;
  j=0 ;
 // delay(2) ;
 
}
void BEAM_ON(){
 // j=j+1 ;
  fff ()  ;
//  dma_disable(DMA1, DMA_CH2);
  //    dma_detach_interrupt(DMA1, DMA_CH2);
 // attachInterrupt(PULSE, fff , RISING);
 // attachInterrupt(PULSE, ....., FALLING);
 // detachInterrupt(PULSE) ;
 // delay(2) ;
 // blink() ;
}
/*
void NEXT_ROT(){
  j=j+1 ;
  attachInterrupt(PULSE, blink, RISING);
 // attachInterrupt(PULSE, ....., FALLING);
 // detachInterrupt(PULSE) ;
 // delay(2) ;
  blink() ;
}
*/
void DMA_RET()
{     
 // pinMode(27,INPUT_PULLUP);
      timer_dev *t = TIMER1;
     
      timer1.pause();
   //   timer1.setPrescaleFactor(PRESCALE)  ;  //128);
    //  timer1.setOverflow(65535);
      timer1.setCount(0);
     timer1.refresh();
     
      timer_reg_map r = t->regs;
/*     
      //using timer1, channel1, maps to pin d27
      //according to maple master pin map.
     // pinMode(27,INPUT_PULLUP);
     
      //capture compare regs TIMx_CCRx used to hold val after a transition on corresponding ICx
     
      //when cap occurs, flag CCXIF (TIMx_SR register) is set,
      //and interrupt, or dma req can be sent if they are enabled.
     
      //if cap occurs while flag is already high CCxOF (overcapture) flag is set..
     
      //CCIX can be cleared by writing 0, or by reading the capped data from TIMx_CCRx
      //CCxOF is cleared by writing 0 to it.
     
      //Capture/Compare 1 Selection
      //  set CC1S bits to 01 in the capture compare mode register.
      //  01 selects TI1 as the input to use. (page 336 stm32 reference)
      //  (assuming here that TI1 is D6, according to maple master pin map)
      //CC1S bits are bits 0,1
      bitSet(r.adv->CCMR1, 0);
      bitClear(r.adv->CCMR1, 1);

     
      //Input Capture 1 Filter.
      //  need to set IC1F bits according to a table saying how long
      //  we should wait for a signal to be 'stable' to validate a transition
      //  on the input.
      //  (page 336 stm32 reference)
      //IC1F bits are bits 7,6,5,4   
      bitClear(r.adv->CCMR1, 7);                       
      bitClear(r.adv->CCMR1, 6); 
      bitSet(r.adv->CCMR1, 5); 
      bitSet(r.adv->CCMR1, 4); 
     
      //sort out the input capture prescaler..
      //00 no prescaler.. capture is done as soon as edge is detected
      bitClear(r.adv->CCMR1, 3);                       
      bitClear(r.adv->CCMR1, 2); 

      //select the edge for the transition on TI1 channel using CC1P in CCER
      //CC1P is bit 1 of CCER (page 339)
      // 0 = falling
      // 1 = rising
      bitClear(r.adv->CCER,1);
     
      //set the CC1E bit to enable capture from the counter.
      //CCE1 is bit 0 of CCER (page 339)
      bitSet(r.adv->CCER,0);

      //enable dma for this timer..
      //sets the Capture/Compare 1 DMA request enable bit on the DMA/interrupt enable register.
      //bit 9 is CC1DE as defined on page 329.
      bitSet(r.adv->DIER,9);     
 */    
  //    dma_init(DMA1);
      dma_setup_transfer( DMA1,    //dma device, dma1 here because that's the only one we have
                          DMA_CH2, //dma channel, channel2, because it looks after tim1_ch1 (timer1, channel1)
                          &(r.adv->CCR1), //peripheral address
                          DMA_SIZE_16BITS, //peripheral size
                          data, //memory address
                          DMA_SIZE_16BITS, //memory transfer size
                          (0
                           //| DMA_FROM_MEM  //set if going from memory, don't set if going to memory.
                          // | DMA_MINC_MODE //auto inc where the data does in memory (uses size_16bits to know how much)
                          // | DMA_TRNS_ERR  //tell me if it's fubar
                           //| DMA_HALF_TRNS //tell me half way (actually, don't as I spend so long there, I dont see 'complete')                         
                          // | DMA_TRNS_CMPLT //tell me at the end
                           ) 
                          );
                                                   
   //   fff() ;
    //    printData();
    
     }
     void DMA_FT()
     {
             timer_dev *t = TIMER1;
     
      timer1.pause();
     timer1.setPrescaleFactor(PRESCALE)  ;  //128);
      timer1.setOverflow(65535);
      timer1.setCount(0);
      timer1.refresh();
     
      timer_reg_map r = t->regs;
     
      //using timer1, channel1, maps to pin d27
      //according to maple master pin map.
     // pinMode(27,INPUT_PULLUP);
     
      //capture compare regs TIMx_CCRx used to hold val after a transition on corresponding ICx
     
      //when cap occurs, flag CCXIF (TIMx_SR register) is set,
      //and interrupt, or dma req can be sent if they are enabled.
     
      //if cap occurs while flag is already high CCxOF (overcapture) flag is set..
     
      //CCIX can be cleared by writing 0, or by reading the capped data from TIMx_CCRx
      //CCxOF is cleared by writing 0 to it.
     
      //Capture/Compare 1 Selection
      //  set CC1S bits to 01 in the capture compare mode register.
      //  01 selects TI1 as the input to use. (page 336 stm32 reference)
      //  (assuming here that TI1 is D6, according to maple master pin map)
      //CC1S bits are bits 0,1
      bitSet(r.adv->CCMR1, 0);
      bitClear(r.adv->CCMR1, 1);

     
      //Input Capture 1 Filter.
      //  need to set IC1F bits according to a table saying how long
      //  we should wait for a signal to be 'stable' to validate a transition
      //  on the input.
      //  (page 336 stm32 reference)
      //IC1F bits are bits 7,6,5,4   
      bitClear(r.adv->CCMR1, 7);                       
      bitClear(r.adv->CCMR1, 6); 
      bitSet(r.adv->CCMR1, 5); 
      bitSet(r.adv->CCMR1, 4); 
     
      //sort out the input capture prescaler..
      //00 no prescaler.. capture is done as soon as edge is detected
      bitClear(r.adv->CCMR1, 3);                       
      bitClear(r.adv->CCMR1, 2); 

      //select the edge for the transition on TI1 channel using CC1P in CCER
      //CC1P is bit 1 of CCER (page 339)
      // 0 = falling
      // 1 = rising
      bitClear(r.adv->CCER,1);
     
      //set the CC1E bit to enable capture from the counter.
      //CCE1 is bit 0 of CCER (page 339)
      bitSet(r.adv->CCER,0);

      //enable dma for this timer..
      //sets the Capture/Compare 1 DMA request enable bit on the DMA/interrupt enable register.
      //bit 9 is CC1DE as defined on page 329.
      bitSet(r.adv->DIER,9);     
     
      dma_init(DMA1);
      dma_setup_transfer( DMA1,    //dma device, dma1 here because that's the only one we have
                          DMA_CH2, //dma channel, channel2, because it looks after tim1_ch1 (timer1, channel1)
                          &(r.adv->CCR1), //peripheral address
                          DMA_SIZE_16BITS, //peripheral size
                          data, //memory address
                          DMA_SIZE_16BITS, //memory transfer size
                          (0
                           //| DMA_FROM_MEM  //set if going from memory, don't set if going to memory.
                           //| DMA_MINC_MODE //auto inc where the data does in memory (uses size_16bits to know how much)
                           //| DMA_TRNS_ERR  //tell me if it's fubar
                           //| DMA_HALF_TRNS //tell me half way (actually, don't as I spend so long there, I dont see 'complete')                         
                           //| DMA_TRNS_CMPLT //tell me at the end
                           ) 
                          );
      
     }
 
пример, мини мэпл, с мэпл компилятором.

Сообщение отредактировал nvc: 15 марта 2020 - 14:27
Добавил теги code

  • 0

#27 bisoft

bisoft

    Яхтенный капитан

  • Капитан
  • 1 145 сообщений
  • Из:Таганрог

Отправлено 15 марта 2020 - 14:21

Так вроде об управлении готовым BR24 радаром - не ?
А он то как раз уже эзернет фреймы готовые выдает и принимает.
И даже не просто эзернет, а IP.

P.S. инфа конечно очень хорошая.
И я так понял, что плагин для OpenCPN написан с неё.

 

Ну я предположил, что старые примерно так и работают, но только отдают аналоговый сигнал.

 

вот такая платка наверное потянет https://www.chipdip..../nucleo-h743zi2 

adc до 3.6 MSPS и порт езернет есть. правда памяти не сильно много, но вроде должно хватить быстродействия на то, чтоб формировать пакеты и передавать их по сети.


  • 0

#28 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 15 683 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 15 марта 2020 - 14:49

дма осуществляет развертку во времени, ацп будет работать с дма?


  • 0

#29 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 15 683 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 15 марта 2020 - 14:53

1.5*10^ 8/3.6*10^6=


  • 0

#30 bisoft

bisoft

    Яхтенный капитан

  • Капитан
  • 1 145 сообщений
  • Из:Таганрог

Отправлено 15 марта 2020 - 15:12

дма осуществляет развертку во времени, ацп будет работать с дма?

 

я программист ;-) хотя при желании и могу разобраться ;-)

я могу если надо выковырять из программы радара для ios или android протокол, а вот железяки делать не пробовал. Разве что arduino купил месяц назад и сделал выполнение одной команды на cf карточке ;-) 


  • 1

#31 nvc

nvc

    Яхтенный капитан

  • Модератор форума
  • 7 550 сообщений
  • Из:Black Sea coast
  • Судно: Leisure17+Seal 36

Отправлено 15 марта 2020 - 15:20

Фигассе простыня :)

Я там теги добавил в сообщение - нагляднее стало.

 

У меня есть полная схема моего старючего радара (Raytheon 1603) вместе с описанием и осциллограммами и методиками настройки.

Могу отсканить и выложить куданить - ибо дело хорошее.

Так могу поучаствовать в написании частей софта. И тестировании.


  • 0

#32 nvc

nvc

    Яхтенный капитан

  • Модератор форума
  • 7 550 сообщений
  • Из:Black Sea coast
  • Судно: Leisure17+Seal 36

Отправлено 15 марта 2020 - 15:25

я программист ;-) хотя при желании и могу разобраться ;-)

"Погромисты народ плечистый" :D

В реальности всё так!
Просто так устроены наши мозги. Я говорю о программистах, а не о кодерах - это разные области совсем.

дма осуществляет развертку во времени, ацп будет работать с дма?

АЦП с DMA почему нет ?
Про развертку не понял.
 
Ну и да.... есть такая штука как DSP, не очень дешевые, но ооотчень быстрые.
Ну правда им все равно цифру надо вначале. Но для расчетов с этой цифрой - очень даже.
  • 0

#33 nvc

nvc

    Яхтенный капитан

  • Модератор форума
  • 7 550 сообщений
  • Из:Black Sea coast
  • Судно: Leisure17+Seal 36

Отправлено 15 марта 2020 - 15:32

Упссс.... только что пришла мысль задействовать SDR для этой цели.

Онож там все заточено и очень шустрое.

Мысль может и дурная :)


  • 0

#34 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 15 683 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 15 марта 2020 - 15:44

"Погромисты народ плечистый" :D

В реальности всё так!
Просто так устроены наши мозги. Я говорю о программистах, а не о кодерах - это разные области совсем.

АЦП с DMA почему нет ?
Про развертку не понял.
 
Ну и да.... есть такая штука как DSP, не очень дешевые, но ооотчень быстрые.
Ну правда им все равно цифру надо вначале. Но для расчетов с этой цифрой - очень даже.

про развертку, каждая ячейка памяти после дма соответствует своему моменту времени после запуска.


время в адресе, амплитуда в ячейке.


  • 0

#35 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 15 683 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 15 марта 2020 - 15:48

ацп параллельный наносек, 4 р., 4 конвеера  градация амплитуды 1/16


  • 0

#36 bisoft

bisoft

    Яхтенный капитан

  • Капитан
  • 1 145 сообщений
  • Из:Таганрог

Отправлено 15 марта 2020 - 16:11

У меня тут завалялась вот такая штука (забыл как ее зовут ;-) ) bemicro fpga cyclone 5 https://www.tme.com/...bemicrocva9.pdf

К ней я еще прикупил АЦП AD9286 https://www.analog.c...eets/AD9286.pdf давным давно все вместе обошлось все в $100. 

Она точно потянет ;-) 

Хотел попробовать свой процессор запрограммить, но так и не дошли руки.

 

IMG_20200315_185626.jpg

 

IMG_20200315_185811.jpg

 

Вот только до лодки я в этом году скорее всего не доберусь :-( 

Сейчас наверное есть новое нечто подобное, но боюсь не за те деньги, что я покупал ;-)

 

SDR наверное вполне можно использовать, сделать простенький генератор, чтоб посадить на частоты телевидения и потом уже через тюнер декодировать(я себе тоже как то прикупил ;-) Его надо наверное уже в какой нибудь raspberry pi втыкать.


  • 0

#37 nvc

nvc

    Яхтенный капитан

  • Модератор форума
  • 7 550 сообщений
  • Из:Black Sea coast
  • Судно: Leisure17+Seal 36

Отправлено 15 марта 2020 - 16:14

про развертку, каждая ячейка памяти после дма соответствует своему моменту времени после запуска.
время в адресе, амплитуда в ячейке.

так понятно.

У меня тут завалялась вот такая штука (забыл как ее зовут ;-) ) bemicro fpga cyclone 5

Ой не, дебри дебревые :)

 

SDR наверное вполне можно использовать, сделать простенький генератор, чтоб посадить на частоты телевидения и потом уже через тюнер декодировать(я себе тоже как то прикупил ;-) Его надо наверное уже в какой нибудь raspberry pi втыкать.

Ага именно так! И тогда все проще станет.
  • 0

#38 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 15 683 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 15 марта 2020 - 16:26

эмулятор сделайте на генераторе импульсов. я на эстээм сделал.


  • 0

#39 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 15 683 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 15 марта 2020 - 16:30

кстати, еще одно применение дма - цифровой фишфайндер.


  • 0

#40 A.E

A.E

    Рулевой 1-го класса

  • Основной экипаж
  • PipPipPipPipPipPip
  • 914 сообщений
  • Из:Владивосток

Отправлено 15 марта 2020 - 17:21

Надеюсь, что после реализации этого преобразователя, старая антенна радара послужит еще долго без замены магнетрона, мотора и т.п...


  • 1

#41 r0b0k0t

r0b0k0t

    Морепроходимец

  • Капитан
  • 1 603 сообщений
  • Из:Сахалин, Холмск
  • Судно: Conrad-46
  • Название: Flagman

Отправлено 15 марта 2020 - 17:45

послужит еще долго без замены магнетрона, мотора и т.п...

))))  Самый расходняк


  • 0

#42 bisoft

bisoft

    Яхтенный капитан

  • Капитан
  • 1 145 сообщений
  • Из:Таганрог

Отправлено 15 марта 2020 - 19:52

Надеюсь, что после реализации этого преобразователя, старая антенна радара послужит еще долго без замены магнетрона, мотора и т.п...

 

Мне почему то кажется, не особо там поуправляешь всем этим. Скорее всего оно будет крутится и работать как работало, а мы просто будем снимать эту информацию и рисовать ее на планшете или будет ее рисовать другой современный плотер.


  • 0

#43 nvc

nvc

    Яхтенный капитан

  • Модератор форума
  • 7 550 сообщений
  • Из:Black Sea coast
  • Судно: Leisure17+Seal 36

Отправлено 16 марта 2020 - 01:19



Мне почему то кажется, не особо там поуправляешь всем этим. Скорее всего оно будет крутится и работать как работало, а мы просто будем снимать эту информацию и рисовать ее на планшете или будет ее рисовать другой современный плотер.

Ага, ибо туда влезть - совсем серьезно надо заморочится.

Да оно и не надо.

Но есть еще сумнение.

Я вот думаю что управление сканером и сигналы оттуда, например у реймарина, сделано +- одинаково у всех его обычных классических сканеров.

Как в Raytheon еще придумали так оно и работает на всей линейке.

 

Но управление и сигналы  других производителей Furuno например, или JRC, сделано уже будет по другому.

Ну как бы принципы, наверное, одинаковые, но реализация может очень сильно отличаться, в том числе по количеству сигналов их форматам, и напряжениям.

И вот тут засада, ибо железячные дела в отличие от софта не "перепрошить".

То бишь такой конвертор сделать можно на коленке, но заточенный будет он под одного производителя.

А сделать универсальное будет намного сложнее и дороже и дольше.


  • 0

#44 bisoft

bisoft

    Яхтенный капитан

  • Капитан
  • 1 145 сообщений
  • Из:Таганрог

Отправлено 16 марта 2020 - 05:53

Видеосигнал поди можно программно по разному декодировать. Посмотрел по фуруно - примерно теже контакты. Но конечно работы больше.

 

Снимок экрана 2020-03-16 в 08.51.35.png


  • 0

#45 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 15 683 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 16 марта 2020 - 09:30

а вот 218, с одной стороны проще, только вот дата интересно какая

Прикрепленные изображения

  • 218.JPG
  • 218.JPG

  • 0

#46 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 15 683 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 16 марта 2020 - 09:51

 RAYTHEON r20xx,есть схема в пдф. но большой больно, не прикрепить, если надо вышлю.

Прикрепленные изображения

  • r20xx.JPG

  • 0

#47 StrangerM

StrangerM

    чужой

  • Модератор форума
  • 15 683 сообщений
  • Из:СПб
  • Судно: МН
  • Название: Stranger

Отправлено 16 марта 2020 - 09:57

Видеосигнал поди можно программно по разному декодировать.

...

не понимаю, это ведь просто выход приемника, не модулирован, тупые пички.


  • 0

#48 yuri_b

yuri_b

    Яхтенный капитан

  • Капитан
  • 2 314 сообщений
  • Из:telaviv
  • Судно: Шхуна
  • Название: Tiku Moye

Отправлено 16 марта 2020 - 10:06

Есть у меня старый рабочий радар с разбитым экраном. Но кажется проще его выкинуть.
  • 0

#49 r0b0k0t

r0b0k0t

    Морепроходимец

  • Капитан
  • 1 603 сообщений
  • Из:Сахалин, Холмск
  • Судно: Conrad-46
  • Название: Flagman

Отправлено 16 марта 2020 - 10:14

Есть у меня старый рабочий радар с разбитым экраном. Но кажется проще его выкинуть.

Если башка целая и с кабелем - можно продать.


  • 0

#50 yuri_b

yuri_b

    Яхтенный капитан

  • Капитан
  • 2 314 сообщений
  • Из:telaviv
  • Судно: Шхуна
  • Название: Tiku Moye

Отправлено 16 марта 2020 - 10:40

Если башка целая и с кабелем - можно продать.

Куда я такую бандуру с Кипра. Посылка будет наверно дороже радара: "Raymarine Raytheon Autohelm ST50 Plus"


  • 0



Ответить



  


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей