Амплитуда генератора

gal
Offline
Зарегистрирован: 08.06.2018
<div>Здравствуйте эксперты.</div><div>Вот программа, состоящая из вольтметра переменного напряжения и синусоидального генератора.</div><div>Как сделать амплитуду генератора такую как амплитуда измеряного напряжения ?</div><div>
</div>#define SAMPLES 100
#include <libmaple/dma.h>
#include <LiquidCrystal.h>                           
#include "EmonLib.h"
#include <math.h>
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
EnergyMonitor emon1, emon2, emon3;                        
float volt, avolt[50],  sumv;
char symbPF = 223;
dma_tube_config dma_cfg, dma_cfg2;
int flag1 = 0;
int out1 = PB7;
int val1[SAMPLES];

int16 shift = 0;
///////////////////////////////////
int amp = 35;
//int amp = volt;

/////////////////////////////////////
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 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_enable(DMA1, DMA_CH4);
  timer_resume(dev1);
}
///////////////////////////////////////////////////
void init_wave()
{
  int i;
  for (i = 0; i < SAMPLES; i++)
  {
    val1[i] = 50 + amp * sin(stp * i);

  }
}


//////////////////////////////////////////////////////////
void setup() {
  int i;
  pinMode(out1, PWM);
  pinMode(PA7, INPUT);    // U

  lcd.begin(16, 2); // set up the LCD’s number of columns and rows:
  emon1.voltage(PA6, 3000, 1.7);   // Voltage: input pin, calibration, phase_shift  U1
  emon2.voltage(PA7, 3000, 1.7);
  emon1.current(PA7, 111.1);         // Current

  Serial.begin(9600);
  timer_conf();
  dma_conf();
  dma_start();
  init_wave();
}

void loop() {
  sumv = 0;

  for (int i = 0; i < 50; i++)
  {
    emon1.calcVI(20, 200);         // Calculate all. No.of half wavelengths (crossings), time-out    TM
    emon2.calcVI(20, 200);
    avolt[i] = emon1.Vrms; // holds volt value
  }
  for (int i = 0; i < 50; i++)
  {
    sumv += avolt[i];
  }
  volt = sumv / 50;
  lcd.setCursor(0, 1);
  lcd.print("U=");
  lcd.print(volt);
}

пробовал так, но не получилось.
int amp = volt;
и

val1[i] = 50 + volt * sin(stp * i); ​

 

gal
Offline
Зарегистрирован: 08.06.2018
 
Здравствуйте эксперты.
Вот программа, состоящая из вольтметра переменного напряжения и синусоидального генератора.
Как сделать амплитуду генератора такую как амплитуда измеряного напряжения ?
andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

1. Ну, "не получилось" у Вас потому, что Вы пытались использовать величину volt перед тем, как присвоить ей какое-либо значение. По умолчанию она равна 0, поэтому и на выходе Вы получили амплитуду 0 Вольт.

2. "Сделать амплитуду такой же..." подразумевает регулировку амплитуды в процессе работы, а этого в Вашем коде не предусмотрено. Определитесь, каким именно образом Вы собираетесь регулировать амплитуду.

gal
Offline
Зарегистрирован: 08.06.2018

Я думаю, нужно выбрать какую то функцию, пробовал  " float amp = volt;" , тоже не поучилось.

gal
Offline
Зарегистрирован: 08.06.2018

Величина "volt" меняется, может быть 1 вольт или 2 , напряжение подается на пин PA7.

Aмплитуда зависит от строчки # 18, могу менять 35 на другие числа и амплитуда меняется .

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

Амплитуду генератора программно изменить нельзя. 

gal
Offline
Зарегистрирован: 08.06.2018

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

как заменить кнопки вольтметром ?

Напряжением на PA7. Строчка # 99 .




#define SAMPLES 92

#define DEBOUNCE_DELAY 10
#define DEBOUNCE_IDLE 0
#define DEBOUNCE_ACTIVE 1

#include <libmaple/dma.h>
/////////////////////////////////////
#include <LiquidCrystal.h>
#include "EmonLib.h"
#include <math.h>
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
EnergyMonitor emon1, emon2, emon3;
float volt, avolt[50],  sumv;
char symbPF = 223;
/////////////////////////////////////
struct debounce_info
{
  int start, state;
  int16 shift;
}
up, down;

dma_tube_config dma_cfg, dma_cfg2;


int flag2 = 0;
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 *dev2 = PIN_MAP[out2].timer_device;
uint8 cc_channel2 = PIN_MAP[out2].timer_channel;

void fun2()
{
  flag2++;
}

void timer_conf()
{
  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);

  /* 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;
  dma_cfg.target_data = 0;

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

void dma_start()
{
  dma_attach_interrupt(DMA1, DMA_CH2, fun2);
  dma_enable(DMA1, DMA_CH2);
  timer_resume(dev2);
}

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() {

  int i;
  pinMode(PA7, INPUT);    // U
  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;

  lcd.begin(16, 2); // set up the LCD’s number of columns and rows:
  emon1.voltage(PA6, 3000, 1.7);   // Voltage: input pin, calibration, phase_shift  U1
  emon2.voltage(PA7, 3000, 1.7);
  emon1.current(PA7, 111.1); 

  Serial.begin(9600);

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

  get_wave(shift);

}

void loop() {

    /////////////////////////////////////
      sumv = 0;

      for (int i = 0; i < 50; i++)
      {
        emon1.calcVI(20, 200);         // Calculate all. No.of half wavelengths (crossings), time-out    TM
        emon2.calcVI(20, 200);
        avolt[i] = emon1.Vrms; // holds volt value
      }
      for (int i = 0; i < 50; i++)
      {
        sumv += avolt[i];
      }
      volt = sumv / 50;
      lcd.setCursor(0, 1);
      lcd.print("U=");
      lcd.print(volt);
      /////////////////////////////////////


  process_key_amp(digitalRead(ampp), &up);
  process_key_amp(digitalRead(ampn), &down);
  delay(100);

}

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;

  }
}

 

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

А что не работает то? Измеряемая амплитуда не соответствует задаваемой? Или совсем не мерется?

gal
Offline
Зарегистрирован: 08.06.2018

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

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

После изменения amp надо вызвать initwave().

gal
Offline
Зарегистрирован: 08.06.2018

Какие строчки ?

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

В первом скече нет строк amp=  в цикле loop, это если менять в процессе работы.

gal
Offline
Зарегистрирован: 08.06.2018
Изменения, строки #20 и # 91, нет реакции на подаваемое напряжение на  PA7

#define SAMPLES 100
#include <libmaple/dma.h>
#include <LiquidCrystal.h>                           
#include "EmonLib.h"
#include <math.h>
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
EnergyMonitor emon1, emon2, emon3;                        
float volt, avolt[50],  sumv;
char symbPF = 223;
dma_tube_config dma_cfg, dma_cfg2;
int flag1 = 0;
int out1 = PB7;
int val1[SAMPLES];

int16 shift = 0;
///////////////////////////////////
//int amp = 35;
int amp = volt;

/////////////////////////////////////
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 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_enable(DMA1, DMA_CH4);
  timer_resume(dev1);
}
///////////////////////////////////////////////////
void init_wave()
{
  int i;
  for (i = 0; i < SAMPLES; i++)
  {
    val1[i] = 50 + amp * sin(stp * i);

  }
}


//////////////////////////////////////////////////////////
void setup() {
  int i;
  pinMode(out1, PWM);
  pinMode(PA7, INPUT);    // U

  lcd.begin(16, 2); // set up the LCD’s number of columns and rows:
  emon1.voltage(PA6, 3000, 1.7);   // Voltage: input pin, calibration, phase_shift  U1
  emon2.voltage(PA7, 3000, 1.7);
  emon1.current(PA7, 111.1);         // Current

  Serial.begin(9600);
  timer_conf();
  dma_conf();
  dma_start();
  init_wave();
}

void loop() {
  amp = volt;
  sumv = 0;

  for (int i = 0; i < 50; i++)
  {
    emon1.calcVI(20, 200);         // Calculate all. No.of half wavelengths (crossings), time-out    TM
    emon2.calcVI(20, 200);
    avolt[i] = emon1.Vrms; // holds volt value
  }
  for (int i = 0; i < 50; i++)
  {
    sumv += avolt[i];
  }
  volt = sumv / 50;
  lcd.setCursor(0, 1);
  lcd.print("U=");
  lcd.print(volt);
}

 

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

20 - лишняя. 

19 - восстановить.

87 перенести после 91.

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

gal, да, в сообщении №6 амплитуда должна изменяться. Правда, сделано это неправильно, поэтому работать будет кое-как. Я, собственно, и задавал вопрос в сообщении №2, чтобы понять, стоит ли Вам предлагать этот вариант. Это - единственное, что можно сделать сравнительно небольшими изменениями. Чтобы сделать правильно, код нужно переписывать полностью. 

Если Вас интересует, как сделать правильно, основную идею могу изложить. Но претворять ее в программный кодв Вам придется самому: я делал это только на ПК, на ARM есть своя специфика, в которой я не разбирался.

Если же Вас в принципе устраивает как работает то, что нарисовано в сообщении №6, то могу посоветовать, как это можно немного улучшить.

gal
Offline
Зарегистрирован: 08.06.2018

Реагирует на изменение напряжения на PА7, но синусоида превратилась в прямоугольник , нада гдето уменьшить амплитуду.

gal
Offline
Зарегистрирован: 08.06.2018

поменял "int amp = 5;", есть синусоида, но коротко 2 сек, а потом обратно самостоятельно в прямоугольник меняется .  

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

gal, как Вы думаете, сколько времени понадобится мартышке, беспорядочно стучащей по клавишам, чтобы напечатать, пусть даже не "Войну и мир", но хотя бы "Капитанскую дочку"?

gal
Offline
Зарегистрирован: 08.06.2018

andriano

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

gal
Offline
Зарегистрирован: 08.06.2018

Вот последняя версия с проблемой как в сообщении # 15
#define SAMPLES 100
#include <libmaple/dma.h>
#include <LiquidCrystal.h>                           
#include "EmonLib.h"
#include <math.h>
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
EnergyMonitor emon1, emon2, emon3;                        
float volt, avolt[50],  sumv;
char symbPF = 223;
dma_tube_config dma_cfg, dma_cfg2;
int flag1 = 0;
int out1 = PB7;
int val1[SAMPLES];

int16 shift = 0;
///////////////////////////////////
int amp = 5;
//int amp = volt;

/////////////////////////////////////
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 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_enable(DMA1, DMA_CH4);
  timer_resume(dev1);
}
///////////////////////////////////////////////////
void init_wave()
{
  int i;
  for (i = 0; i < SAMPLES; i++)
  {
    val1[i] = 50 + amp * sin(stp * i);

  }
}


//////////////////////////////////////////////////////////
void setup() {
  int i;
  pinMode(out1, PWM);
  pinMode(PA7, INPUT);    // U

  lcd.begin(16, 2); // set up the LCD’s number of columns and rows:
  emon1.voltage(PA6, 3000, 1.7);   // Voltage: input pin, calibration, phase_shift  U1
  emon2.voltage(PA7, 3000, 1.7);
  emon1.current(PA7, 111.1);         // Current

  Serial.begin(9600);
  timer_conf();
  dma_conf();
  dma_start();
//init_wave();
}

void loop() {
   init_wave();
  amp = volt;
  sumv = 0;

  for (int i = 0; i < 50; i++)
  {
    emon1.calcVI(20, 200);         // Calculate all. No.of half wavelengths (crossings), time-out    TM
    emon2.calcVI(20, 200);
    avolt[i] = emon1.Vrms; // holds volt value
  }
  for (int i = 0; i < 50; i++)
  {
    sumv += avolt[i];
  }
  volt = sumv / 50;
  lcd.setCursor(0, 1);
  lcd.print("U=");
  lcd.print(volt);
}

 

gal
Offline
Зарегистрирован: 08.06.2018

Проблема связана с ЛСД, он включается с опозданием, пока он не включен синусоида есть. 

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

Да какая разница, кнопки или не кнопки - суть от этого не меняется.

Ваш код из сообщения №0 не предназначен для оперативного изменения амплитуды.

Правильное решение - переписать код полностью.

Существует еще и неправильное, но кое-как работающее решение - дополнить код костылями.

Пример костылей содержится в сообщении №6.

А кнопкой Вы меняете амплитуду, энкодером, фотодатчиком или амплитудой внешнего сигнала - это несущественно.

gal
Offline
Зарегистрирован: 08.06.2018
Сообщение # 6.
Вы предлагаете улучшение работы кнопок или замену их так что амплитуда будет зависить от напряжения на PА7 ?
gal
Offline
Зарегистрирован: 08.06.2018

Вольтметр показывает значение в милливольтах, надо поменять на вольты и должно быть хорошо.

gal
Offline
Зарегистрирован: 08.06.2018
Есть синусоида, регулируется как надо, нужна только калибровка.
Большое спасибо за помощь.
nik182
Offline
Зарегистрирован: 04.05.2015

В прямоугольники превращается, потому что есть положительная обратная связь. Вольты и амплитуда связаны не прямо. Строка 91 должна выглядеть как amp=k*volt; .   float k надо подобрать что бы синус был нужной амплитуды. Может даже по условию чуть чуть менять amp если volt  больше или меньше забанного. 

gal
Offline
Зарегистрирован: 08.06.2018
Есть синусоида пака на ЛСД номер меньш 50, попробую строчку 91. 
Осталось чтобы амплитуды совпадали. 
Еще раз спасибо.
gal
Offline
Зарегистрирован: 08.06.2018

Поставил " amp=0.78*volt;" - амплитуды выглядят одинаково.

gal
Offline
Зарегистрирован: 08.06.2018

andriano

Готовый делать изменения в посте в # 6

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

gal пишет:

Сообщение # 6.
Вы предлагаете улучшение работы кнопок или замену их так что амплитуда будет зависить от напряжения на PА7 ?

Нет, я вообще не рассматриваю этот вопрос.

Насколько я понял, Вы хотите переделать скетч №0 так, чтобы амплитуда сигнала зависела от некоторого внешнего сигнала. Строго говоря, скетч №0 не предназначен для изменения амплитуды в процессе работы. Чтобы сделать хорошо, его надо переписывать с 0. Но можно внести в скетч №0 заплатку, что он будет удовлетворять Вашему желанию, но при этом будет работать не очень хорошо. В смысле, в генерируемом им сигнале будут помехи. Величину их прогнозировать не берусь. Собственно, способ, как реализовать эту заплатку, Вы сами разместили в скетче №6. Но, повторяю, это не очень хороший способ.

Далее: если Вас полностью устраивает, как работает скетч №0, с внесенными в него изменениями из №6, то вопрос решен (т.е. Вы помехи почти не замечаете, либо их уровень не вызывает у Вас дискомфорта).

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

Если уровень помех неприемлем, то, скорее всего, те поправки к заплатке, которые я могу предложить, не приведут к желаемому и, чтобы добиться хорошего результата, скетч придется переписывать с 0. Я могу высказать общую идею, что надо делать, но не смогу подсказать конкретную реализацию, т.к. повторяю, на ARM я этого не делал.

 

PS. И еще у меня впечатление, что те скетчи, что Вы размещаете, на само деле есть фрагменты более крурпного скетча, из которого Вы выбрасываете некоторые куски (не всегда удачно).

gal
Offline
Зарегистрирован: 08.06.2018

Да помехи пригодилось бы уменьшить. Подскажите что делать может мне получиться. 

Многие AVR программы с Ардуино Уно работают в ARM

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

gal пишет:

Да помехи пригодилось бы уменьшить. Подскажите что делать может мне получиться. 

1. Чем длиннее буфера, тем меньше вероятность конфликта, когда DMAC и CPU пытаются обратиться к одной и той же ячейке. Поэтому желательно увеличить размер буфера. Благо, в Due памяти в 48 раз больше, чем в Uno.

2. На ARM, так же, как и на AVR нет FPU. Соответственно, плавающая точка считается крайне медленно. Поэтому целесообразно использовать такой алгоритм:

- заранее просчитать массив значений синуса в целых числах и внести его прямо в скетч с квалификатором const,

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

Цитата:

Многие AVR программы с Ардуино Уно работают в ARM

А это как?

gal
Offline
Зарегистрирован: 08.06.2018

[/quote]

А это как?

[/quote]

Часто хватает поменять название пинов, А0 на P А6 ......

 

gal
Offline
Зарегистрирован: 08.06.2018

Имеешь в виду Sine Look Up Table ?

http://www.daycounter.com/Calculators/Sine-Generator-Calculator.phtml

gal
Offline
Зарегистрирован: 08.06.2018
Приложение для сравнения качества используя Sine Look Up Table  и функцию синуса, похоже как в первом сообщении.
Вот генератор прямоугольной формы который задаёт частоту.

HardwareTimer pwmtimer2(2);
void setup() {
pinMode(PA3, PWM);
  //pinMode(PB11, PWM);
  pwmtimer2.pause();
  pwmtimer2.setPrescaleFactor(1);      
  pwmtimer2.setOverflow(10000-1);          
  pwmtimer2.setCompare(TIMER_CH4, 5000); 
  pwmtimer2.refresh();
  pwmtimer2.resume();
}

void loop() {
}

 

надо добавить
А - Sine Look Up Table
В - функцию синуса - val1[i] = 50 + amp * sin(stp * i); ?
  sinVal = (sin(x*(3.1412/180)));
 
Sine Look Up Table
byte sine256[] PROGMEM = { 
    127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,
    184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,
    229,231,233,234,236,238,239,240,242,243,244,245,247,248,249,249,250,251,252,
    252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,
    249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,221,
    219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,
    170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,
    111,108,105,102,99,96,93,90,87,84,81,78,76,73,70,67,64,62,59,56,54,51,49,46,
    44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,
    2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,
    25,27,29,31,33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,
    87,90,93,96,99,102,105,108,111,115,118,121,124,
};
 
 
andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

gal пишет:

Имеешь в виду Sine Look Up Table ?

http://www.daycounter.com/Calculators/Sine-Generator-Calculator.phtml

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

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

gal пишет:

Приложение для сравнения качества используя Sine Look Up Table  и функцию синуса, похоже как в первом сообщении.
Вот генератор прямоугольной формы который задаёт частоту.

HardwareTimer pwmtimer2(2);
void setup() {
pinMode(PA3, PWM);
  //pinMode(PB11, PWM);
  pwmtimer2.pause();
  pwmtimer2.setPrescaleFactor(1);      
  pwmtimer2.setOverflow(10000-1);          
  pwmtimer2.setCompare(TIMER_CH4, 5000); 
  pwmtimer2.refresh();
  pwmtimer2.resume();
}

void loop() {
}

 

надо добавить
А - Sine Look Up Table
В - функцию синуса - val1[i] = 50 + amp * sin(stp * i); ?
  sinVal = (sin(x*(3.1412/180)));
 
Sine Look Up Table
byte sine256[] PROGMEM = { 
    127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,
    184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,
    229,231,233,234,236,238,239,240,242,243,244,245,247,248,249,249,250,251,252,
    252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,
    249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,221,
    219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,
    170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,
    111,108,105,102,99,96,93,90,87,84,81,78,76,73,70,67,64,62,59,56,54,51,49,46,
    44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,
    2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,
    25,27,29,31,33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,
    87,90,93,96,99,102,105,108,111,115,118,121,124,
};
 
 

Совершенно не понял ничего из того, что Вы написали.

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

gal
Offline
Зарегистрирован: 08.06.2018

Возвращаемся к сообщению 29 и 30

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

gal, похоже, Вы не умеете разговаривать иначе, кроме как загадками.

gal
Offline
Зарегистрирован: 08.06.2018
Моё предложение не возможно сделать.
Вы предлагали улучшение моей программы, что можете предложить ?
andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

Свои предложения я изложил в сообщении №31.

gal
Offline
Зарегистрирован: 08.06.2018

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

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

С размещением примеров Вы и сами прекрасно справляетесь.

gal
Offline
Зарегистрирован: 08.06.2018
  for (int i = 0; i < 50; i++)
  {
    sumv += avolt[i];
  }
  volt = sumv / 500;
  delay(2000);  //правильное место ?

  lcd.setCursor(0, 1);
  lcd.print("U=");
  lcd.print(volt/9); // triming b
}

Когда буду прекрасно разбираться не буду спрашивать а отвечать. 

Вот следующий вопрос. 
Как добавить делай в програму собщение # 19 чтобы амплитуда изменялась с опозданием 2 чек ?
delay(2000);     // waits for 2 seconds

 

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

Вообще-то можно сделать несколькими разными способами. Все зависит от того, чего именно Вы хотите этим добиться.

Можно и так, как Вы написали в сообщении №43.

gal
Offline
Зарегистрирован: 08.06.2018

Спасибо, завтра проверю.