Заменить синус на прямоугольник

gena321
Offline
Зарегистрирован: 19.01.2019
 
Добрый день !
Вот программа генератора синуса с постом лооп .
#define SAMPLES 120
#include <libmaple/dma.h>
dma_tube_config dma_cfg, dma_cfg2;


int flag1 = 0;
int out1 = PB7;
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 *dev1 = PIN_MAP[out1].timer_device;
uint8 cc_channel1 = PIN_MAP[out1].timer_channel;


void fun()
{
  flag1++;
}
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);
}


void dma_conf()
{
  dma_init(DMA1);
  /* T4C2 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_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_CH2);
}
void init_wave()
{
  int i;
  for (i = 0; i < SAMPLES; i++)
  {
    val1[i] = 40 + amp * sin(stp * i);

  }
}
void setup()
{
  int i;
  pinMode(out1, PWM);
   timer_conf();
  dma_conf();
  dma_start();
  init_wave();
}
void loop()
{
  }

 

gena321
Offline
Зарегистрирован: 19.01.2019
Вот программа генератора прямоугольных импулсов.
#define SAMPLES 120
#include <libmaple/dma.h>
dma_tube_config dma_cfg, dma_cfg2;

int flag1 = 0;
int out1 = PB7;
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 *dev1 = PIN_MAP[out1].timer_device;
uint8 cc_channel1 = PIN_MAP[out1].timer_channel;


void fun()
{
  flag1++;
}
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);
}

void dma_conf()
{
  dma_init(DMA1);
  /* T4C2 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_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_CH2);
}
void init_wave()
{
  int i;
  for (i = 0; i < SAMPLES; i++)
  {
    val1[i] = 40 + amp * sin(stp * i);
/*
    if ( val1[i]  > 40)
    {
      digitalWrite(PB6, HIGH);
    }
    else
    {
      digitalWrite(PB6, LOW);
    }
    */
  }
}


void setup()
{
  int i;
  //pinMode(out1, PWM);
  pinMode(out1, OUTPUT);
  timer_conf();
  dma_conf();
  dma_start();
  init_wave();
}


void loop()
{
  
 int i;
   for (i = 0; i < SAMPLES; i++)
  if ( val1[i]  > 40)
    
  {
   digitalWrite(PB6, HIGH);
  }
  else
  {
    digitalWrite(PB6, LOW);
  }
}

 

Как сделать чтобы лооп дальше был пустой  ?
DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

b707
Offline
Зарегистрирован: 26.05.2017

gena321 - признайтесь, вы же ни строчки не понимаете в этом коде?

давайте я вам слегка поясню - в первом коде значения массива val1[] загружаются в регистры таймера с помощью ДМА, позволяя генерить ШИМ с амплитудной модуляцией сложной формы.

А ко второму коду возникает два вопроса - 1) если нужны обычные прямоугольные импульсы, нафига использовать массив и подгрузку данных через ДМА, когда можно взять обычный ШИМ, который запускается раз в 10 проще?

И второй вопрос - что это за бредятина в луп, к чему там digitalWrite() - это вы так прямоугольные импульсы генерите? :))))

А до вопроса "как сделать луп пустым" я даже не добрался - он вообще не имеет смысла.

 

Зачем вы вообще взялись редактировать непонятный вам код? - насколько я понимаю, все что вам нужно - это генерить прямоугольник заданной частоты на PB6? - так это ж в три строки делается, а не в 90

 

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А ведь дед дело говорит!

gena321
Offline
Зарегистрирован: 19.01.2019

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

 

val1[i] = 40 + amp * sin(stp * i);

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

gena321 пишет:

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

 

val1[i] = 40 + amp * sin(stp * i);

Нет, ну можно, наверное, гланды через задний проход удалять, но зачем? В ответе #3 вам же все разъяснили.

b707
Offline
Зарегистрирован: 26.05.2017

gena321 пишет:

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

 

val1[i] = 40 + amp * sin(stp * i);

 

если прямоугольник и правда прямоугольный :) - то не нужно, все делается в разы проще, без массивов и ДМА. Но если у вас прямоугольник какой-то особой сложной формы :) - то тогда предварительно генерите для него  шейп по аналогии с генерацией синуса, сохраняйте в массив - а потом грузите массив в таймер. Так тоже будет работать, хотя согласен с предыдущим оратором насчет гланд и заднего прохода.

Logik
Offline
Зарегистрирован: 05.08.2014

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

val1[i] = 40 + i>(SAMPLES>/2)?amp:-amp;

b707
Offline
Зарегистрирован: 26.05.2017

Logik пишет:

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

val1[i] = 40 + i>(SAMPLES>/2)?amp:-amp;

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

 

gena321
Offline
Зарегистрирован: 19.01.2019

сделал так 

#define SAMPLES 77
#include <libmaple/dma.h>
dma_tube_config dma_cfg, dma_cfg2;


int flag1 = 0;
int out1 = PB7;
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 *dev1 = PIN_MAP[out1].timer_device;
uint8 cc_channel1 = PIN_MAP[out1].timer_channel;


void fun()
{
  flag1++;
}
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);
}


void dma_conf()
{
  dma_init(DMA1);
  /* T4C2 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_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_CH2);
}


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


  }
}


void setup()
{
  int i;
  pinMode(out1, PWM);
  timer_conf();
  dma_conf();
  dma_start();
  init_wave();
}


void loop()
{


}
1. Амплитуда ШИМ для синуса 3.3 В, амплитуда синуса 2В.

 

2. Амплитуда ШИМ для прямоугольника 1.65 В, амплитуда прямоугольника 30 мВ.

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

-

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015
val1[i] = 40 + i > (SAMPLES / 2) > 40 - i;

вы эту строчку как понимаете?

там два состояния, 0 или 1 (мне так кааца).

b707
Offline
Зарегистрирован: 26.05.2017

xDriver пишет:

val1[i] = 40 + i > (SAMPLES / 2) > 40 - i;

вы эту строчку как понимаете?

там два состояния, 0 или 1 (мне так кааца).

а как это можно понять? - это же бред полный.

Гена321 - чеж вы даже списать грамотно одну строку, которую вам Логик дал - и ту не сумели

b707
Offline
Зарегистрирован: 26.05.2017

gena321 - мож вы перестанете муйней страдать и напишете четко. что вы пытаетесь сделать? Генератор прямоугольных импульсов - это ШИМ, почему вы его не сипользуете?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

BOOM пишет:

А ведь дед дело говорит!

А когда было по-другому?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

xDriver пишет:

val1[i] = 40 + i > (SAMPLES / 2) > 40 - i;

вы эту строчку как понимаете?

А Вы как?

Я вот никак не понимаю :(