Двухканальный генератор

gena321
Offline
Зарегистрирован: 19.01.2019
всем привет
Пытаюсь  добавить второй канал , выход пин ПА 10, пака на этом пине ничего нетъ , где ошибка ?
Вот программа 
#define SAMPLES 100
#define DEBOUNCE_DELAY 10
#define DEBOUNCE_IDLE 0
#define DEBOUNCE_ACTIVE 1


#include <libmaple/dma.h>


struct debounce_info
{
  int start, state;
  int16 shift;
}  up, down;


dma_tube_config dma_cfg, dma_cfg2;


int flag1 = 0;
int flag2 = 0;
/////////////////////////////
int out1 = PA10;
int out2 = PA8;
/////////////////////////////
int val1[SAMPLES];
int val2[SAMPLES];
int ampp = PB9;
int ampn = PB6;
int16 shift = 0;
int amp = 35;
int cnt = 0;
int time_track = 0;
float stp = 6.2831 / SAMPLES;
int ret = 17;


//////////////////////////////////////////////////
timer_dev *dev1 = PIN_MAP[out1].timer_device;
uint8 cc_channel1 = PIN_MAP[out1].timer_channel;
//////////////////////////////////////////////////////////


timer_dev *dev2 = PIN_MAP[out2].timer_device;
uint8 cc_channel2 = PIN_MAP[out2].timer_channel;


void fun()
{
  flag1++;
}


void fun2()
{
  flag2++;
}


void timer_conf()
{
  ///////////////////
  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);
  //////////////////////
  timer_dma_set_base_addr(dev2, TIMER_DMA_BASE_CCR1);
  timer_dma_set_burst_len(dev2, 1);
  timer_dma_enable_req(dev2, cc_channel2);
  timer_set_reload(dev2, 102);
  timer_set_prescaler(dev2, 0);
}


void dma_conf()
{


  dma_init(DMA1);
  //////////////////////////////////////////////////////////////////////////////////
  /* T1C3 DMA C4 */
  dma_cfg.tube_dst = &(dev1->regs.gen->DMAR);
  dma_cfg.tube_dst_size = DMA_SIZE_32BITS;
  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_TIM1_CH3;  //T1C3, PA10


  dma_cfg.target_data = 0;
  ret = dma_tube_cfg(DMA1, DMA_CH4, &dma_cfg);
  ///////////////////////////////////////////////////////////////////////////////////
  // ampl
  /* T1C1 DMA C2 */
  dma_cfg.tube_dst = &(dev2->regs.gen->DMAR);
  dma_cfg.tube_dst_size = DMA_SIZE_32BITS;
  dma_cfg.tube_src = val2;
  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_TIM1_CH1; // T1C1,PA8


  dma_cfg.target_data = 0;
  ret = dma_tube_cfg(DMA1, DMA_CH2, &dma_cfg);
}


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


  dma_attach_interrupt(DMA1, DMA_CH2, fun2); //PA8
  dma_enable(DMA1, DMA_CH2);
  timer_resume(dev2);
}
/////////////////////////////////////////////////////////////////
void init_wave()
{
  int i;
  for (i = 0; i < SAMPLES; i++)
  {
    val1[i] = 50 + amp * sin(stp * i);
    val2[i] = val1[i];
  }
}
/////////////////////////////////////////////////////////////////
void get_wave(int16 shift)
{


  int i;


  for (i = 0; i < SAMPLES; i++)


  {
    val2[i] = 50 + amp * sin( stp * i + shift * 0.1 * 6.2831 / 360);
  }
}


void setup() {


  pinMode(out1, PWM);
  pinMode(out2, PWM);
  pinMode(ampp, INPUT_PULLDOWN);
  pinMode(ampn, INPUT_PULLDOWN);


  memset(&up, 0, sizeof(debounce_info));
  memset(&down, 0, sizeof(debounce_info));


  up.shift = 1;
  down.shift = -1;


  Serial.begin(9600);


  timer_conf();
  dma_conf();
  dma_start();


  init_wave();


  get_wave(shift);


}


void loop()
{
  process_key_amp(digitalRead(ampp), &up);
  process_key_amp(digitalRead(ampn), &down);
}


void process_key_amp(int val, struct debounce_info *k)
{
  switch (k->state)
  {
    case DEBOUNCE_IDLE:
      if (val == HIGH)
      {
        k->state = DEBOUNCE_ACTIVE;
        k->start = millis();
      }
      break;


    case DEBOUNCE_ACTIVE:
      if (val == HIGH)
      {
        if (millis() - k->start > DEBOUNCE_DELAY)
        {
          amp += (int)k->shift;
          get_wave(shift);
        }
      }
      else
        k->state = DEBOUNCE_IDLE;


      break;
  }
  Serial.println(amp);
}

 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А кто Вам сказал, что в этой программе есть ошибка?

nik182
Offline
Зарегистрирован: 04.05.2015

Просмотрел программу. Только в сетапе нашёл команду ардуино pinMode с нестандартными параметрами. Казалось бы - причём здесь ардуино? 

gena321
Offline
Зарегистрирован: 19.01.2019
В программе есть ошибка, потому что на PB8 есть синус а на  PB10 нет.
Пин моде работает для PB8, использую  арддуино  IDE.
То что я добавил находится  между   ///////
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

gena321, программа всегда работает так, как она написана (но не всегда так, как ее хотели написать).

Ошибка в Вашем случае - это откнение реальной работы программы от ожидаемой. 

Но никто кроме Вас не знает, чего именно Вы хотите от программы.

Поэтому подобные вопросы крайне желательно излагать по схеме:

1. Что должна делать программа.

2. Что она на самом деле делает.

3. Чем второе отличается от первого.