Arduino Polska Forum

Pełna wersja: generator sinusa
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam
Oto generator sinusa, zmiany częstotliwości dokonuje się  poprzez zmianę cyfr  w pierwszej linijce = #define SAMPLES 77
Próbuje zmodyfikować program żeby zmianę  można byłoby dokonywać przyciskami na PB12 I PB14.
Kod:
/////////////////////
#define SAMPLES 77
//#define SAMPLES k ????????????????????
int k;

////////////////////

#include <libmaple/dma.h>
dma_tube_config dma_cfg, dma_cfg2;
int flag = 0;
int flag1 = 0;
int out = PB6;
int out1 = PB7;
int val[SAMPLES];
int val1[SAMPLES];

int16 shift = 0;

int amp = 40;
int cnt = 0;
int time_track = 0;
float stp = 6.2831 / SAMPLES;
int ret = 17;

timer_dev *dev = PIN_MAP[out].timer_device;
uint8 cc_channel = PIN_MAP[out].timer_channel;
timer_dev *dev1 = PIN_MAP[out1].timer_device;
uint8 cc_channel1 = PIN_MAP[out1].timer_channel;

void fun()
{
  flag++;
}
void fun1()
{
  flag1++;
}

void timer_conf()
{
  /////////////
  timer_dma_set_base_addr(dev, TIMER_DMA_BASE_CCR2);
  timer_dma_set_burst_len(dev1, 1);
  timer_dma_enable_req(dev, cc_channel1);
  timer_set_reload(dev, 102);
  timer_set_prescaler(dev, 0);
  ///////////////
  timer_dma_set_base_addr(dev1, TIMER_DMA_BASE_CCR2);
  timer_dma_set_burst_len(dev1, 1);
  timer_dma_enable_req(dev1, cc_channel1);
  timer_set_reload(dev1, 102);
  timer_set_prescaler(dev1, 0);
}

void dma_conf()
{
  dma_init(DMA1);
  /* T4C2 DMA C4 */
  dma_cfg.tube_dst = &(dev->regs.gen->DMAR);
  dma_cfg.tube_dst = &(dev1->regs.gen->DMAR);
  dma_cfg.tube_dst_size = DMA_SIZE_32BITS;
  dma_cfg.tube_src = val;
  dma_cfg.tube_src = val1;
  dma_cfg.tube_src_size = DMA_SIZE_32BITS;
  dma_cfg.tube_nr_xfers = SAMPLES;
  dma_cfg.tube_flags = DMA_CFG_SRC_INC | DMA_CFG_CIRC | DMA_CFG_CMPLT_IE;
  dma_cfg.tube_req_src = DMA_REQ_SRC_TIM4_CH1;
  dma_cfg.tube_req_src = DMA_REQ_SRC_TIM4_CH2;
  dma_cfg.target_data = 0;

  ret = dma_tube_cfg(DMA1, DMA_CH4, &dma_cfg);
}

void dma_start()
{
  dma_attach_interrupt(DMA1, DMA_CH4, fun);
  dma_enable(DMA1, DMA_CH4);
  timer_resume(dev1);
  dma_enable(DMA1, DMA_CH1);
  dma_enable(DMA1, DMA_CH2);

}

void init_wave()
{
  int i;
  for (i = 0; i < SAMPLES; i++)
  {
    val[i] = 40 + amp * sin(stp * i);
    val1[i] = 40 + amp * sin(stp * i);
    //////////////

  }
}

void setup()
{
  int i;
  pinMode(out1, PWM);
  pinMode(out, OUTPUT);
  pinMode(PB13, INPUT_PULLUP);
  pinMode(PB15, INPUT_PULLUP);
  timer_conf();
  dma_conf();
  dma_start();
  init_wave();
}

void loop()

{
if (digitalRead(PB12) == LOW)
  {
    k++;
  }
  if (digitalRead(PB14) == LOW)
  {
    k--;
  }

}
Palcami wciskasz przyciski z czasami rzędu dziesiątek ms, jeśli tak będziesz obsługiwał przycisk, to zmienna k będzie się modyfikować o miliony przy każdym dotknięciu.
Obsługa przycisków to część każdego kursu Arduino, są też gotowe biblioteki, ogólnie polecam OneButton, choć z STM nie działa, ale jest innych od groma.
Mam inne programy gdzie używam przycisków, w tym przypadku nie wychodzi mi.