• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Zmiana częstotliwości generatora przyciskami
#1
Witam
ręczna zmiana częstotliwości generatora = zmiana wartości f = działa prawidłowo
zmiana częstotliwości za pomocą przycisków nie działa, może ktoś wie jak zrobić żeby przyciski działały?


Kod:
#include <libmaple/dma.h>
#include <LiquidCrystal.h>
//LiquidCrystal lcd(PB9,PA11,PB15,PB14,PB13,PB12);
LiquidCrystal lcd(PB9, PC14, PB15, PB14, PB13, PB12);
#define SAMPLES_TX 64
#define dt (1.0/SAMPLES_TX)
#define F(x)(0.5*(1+sin(TWO_PI*x)))

HardwareTimer Timer_4(4);
HardwareTimer Timer_2(2);
HardwareTimer Timer_3(3);
int f;
int Sound_schem = 0;
int Faza_b;
unsigned int micros_1, micros_2;
unsigned int millis_1, millis_2;
int adc_data_1, adc_data_2;
int val_TX[SAMPLES_TX];

const int LED_LCD = PA8;
int V_tic = 0;
int V_bat = 0;
int MENU_index = 1;

#define eeprom_adr 1
#define num_prof 4
#pragma pack(push, 1);
struct strMem
{
  float amp_TX[num_prof];
  int F_TX[num_prof];
  int Threshold[num_prof];
  int Comp_Phase[num_prof];
  int need_phase[num_prof];
  int Adjustment_Phase[num_prof];

  int Prof;
} Mem;

const int OUT_TX = PB8;
dma_tube_config dma_cfg_TX, dma_cfg2;
timer_dev *dev_TX = PIN_MAP[OUT_TX].timer_device;//Timer4
uint8 cc_channel_TX = PIN_MAP[OUT_TX].timer_channel;//Channel3

void TX_conf()
{
  Timer_4.pause();
  Timer_3.pause();
  Timer_3.setCount(0);
  Timer_4.setCount(0);

  set_sin_tab(Mem.Comp_Phase[Mem.Prof], Mem.amp_TX[Mem.Prof]);


  timer_dma_set_base_addr(dev_TX,  TIMER_DMA_BASE_CCR3);
  timer_dma_set_burst_len(dev_TX, 1);
  timer_dma_enable_req(dev_TX, cc_channel_TX);
  // timer_set_reload(dev_TX, Mem.F_TX[Mem.Prof] );//++++++++++++++++++++++++++

  timer_set_prescaler(dev_TX, 0);
  Timer_4.setMasterModeTrGo(TIMER_CR2_MMS_COMPARE_OC3REF);

  dma_init(DMA1);
  dma_disable(DMA1, DMA_CH5);
  dma_cfg_TX.tube_dst = &(dev_TX->regs.gen->DMAR);
  dma_cfg_TX.tube_dst_size = DMA_SIZE_32BITS;
  dma_cfg_TX.tube_src = val_TX;
  dma_cfg_TX.tube_src_size = DMA_SIZE_32BITS;
  dma_cfg_TX.tube_nr_xfers = SAMPLES_TX;
  dma_cfg_TX.tube_flags = DMA_CFG_SRC_INC | DMA_CFG_CIRC | DMA_CFG_CMPLT_IE;
  dma_cfg_TX.tube_req_src = DMA_REQ_SRC_TIM4_CH3;
  dma_cfg_TX.target_data = 0;
  dma_tube_cfg(DMA1, DMA_CH5, &dma_cfg_TX);
  dma_enable(DMA1, DMA_CH5);



  Timer_3.setPrescaleFactor(1);
  Timer_3.setOverflow((SAMPLES_TX / 2) - 1);
  timer_oc_set_mode(TIMER3, 3, TIMER_OC_MODE_TOGGLE, TIMER_OC_PE);
  timer_oc_set_mode(TIMER3, 4, TIMER_OC_MODE_TOGGLE, TIMER_OC_PE);
  Timer_3.setCompare(TIMER_CH3, 4);
  Timer_3.setCompare(TIMER_CH4, 20);
  Timer_3.setSlaveFlags( TIMER_SMCR_TS_ITR3 | TIMER_SMCR_SMS_EXTERNAL  );

  Timer_3.refresh();
  Timer_4.refresh();
  Timer_3.resume();
  Timer_4.resume();
}

void set_sin_tab(int faze, float sin_amp)
{

  float y;
  float maxy = 0;
  for (int i = 0; i < (SAMPLES_TX); i++) if ((y = F(dt * i)) > maxy) maxy = y;

  //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  //ręczna zmiana częstotliwości = zmiana wartości f = ok
  //int f = 50;
  int f = 100;
  //int f = 150;
  //int f = 200;

  //-------------------------------------------- używanie przycisków = nie działa ----------------------------------
  if (digitalRead(PB3) == LOW)

  {
    if(f>250) f= 250;
    f++;
     delay(100);
  }


  if (digitalRead(PB4) == LOW)

  {
     if(f<0) f= 0;
    f--;
    delay(100);
  }
  //----------------------------------------------------------------------
for (int i = 0; i < (SAMPLES_TX); i++) val_TX[i] = 1 + sin_amp * ((f - 1) / maxy) * F(dt * (i + faze)) ;
timer_set_reload(dev_TX, f );
  //++++++++++++++++++++++++++++++++++++++++++++++++++++++
}

//======================================================setup()==============================================================
void setup()
{
  //Serial.begin(9600);
  Serial.begin(115200);
  pinMode(OUT_TX, PWM); //
  pinMode(PB0, PWM); //Yy
  pinMode(PB1, PWM); //Xy
  pinMode(PA7, INPUT_PULLUP);
  pinMode(PA6, INPUT_PULLUP);
  pinMode(PB3, INPUT_PULLUP);
  pinMode(PB4, INPUT_PULLUP);
  pinMode(LED_LCD, OUTPUT);


  lcd.begin(16, 2);

  init_eeprom_mem();
  TX_conf();
}

//=====================================================loop()============================================================
void loop()
{
 
  Serial.print("f = ");
  Serial.println(f);
}

void init_eeprom_mem()
{
  for (int i = 0; i < num_prof; i++)
  {
    Mem.amp_TX[i] = 1.0;
    Mem.F_TX[i] = 160;
  }
  Mem.Prof = 0;

}
 
Odpowiedź
#2
A jak oczekujesz by to działało? Wg kodu wygląda to tak, że wciśnięcie przycisku i zrobienie resetu powoduje, że przy starcie program ustawia parametry.
Może to jakaś niedokończone demo?
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Tak jak pisał kolega kaczakat - ustawianie f w Twoim programie odbywa się w obrębie funkcji wywoływanej przez funkcję umieszczoną w setup(). Wykona się to tylko po resecie urządzenia.

Jeżeli chcesz, żeby to działało to zmiana częstotliwości musi być wrzucona w loop(). Sprawę komplikuje troszkę temat użytych delay(), ale dasz radę.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości