Регулировка частоты
- Войдите на сайт для отправки комментариев
Втр, 02/03/2021 - 16:02
Здравствуйте
Программа генератора , частоту можна менять в ручную меняя число SAMPLES
#include "LiquidCrystal.h"
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
///////////////////////////
#define SAMPLES 88
///////////////////////////
#include <libmaple/dma.h>
dma_tube_config dma_cfg;
int flag1 = 0;
int out1 = PB7;
int val1[SAMPLES];
int amp = 50;
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);//
// timer_resume(dev2);
}
void init_wave()
{
//int i;
for (int i = 0; i < SAMPLES; i++)
{
val1[i] = 50 + amp * sin(stp * i);
}
}
void setup() {
lcd.begin(16, 2);
int i;
//int j;
pinMode(out1, PWM);
pinMode(PB13, INPUT_PULLDOWN);
pinMode(PB12, INPUT_PULLDOWN);
timer_conf();
dma_conf();
dma_start();
init_wave();
}
void loop()
{
lcd.setCursor(0, 1);
lcd.print("Samples = ");
//lcd.print(Samples);
delay(100);
}
пытаюсь сделать с помощью кнопок но на PB7 нет сигнала
#include "LiquidCrystal.h"
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
///////////////////////////
#define MAX_SAMPLES 200
int Samples = 90;
///////////////////////////
#include <libmaple/dma.h>
dma_tube_config dma_cfg;
int flag1 = 0;
int out1 = PB7;
int val1[MAX_SAMPLES];
int amp = 50;
int cnt = 0;
int time_track = 0;
/////////////////////////////////////////////////
float stp = 6.2831 / MAX_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 = MAX_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);//
// timer_resume(dev2);
}
void init_wave()
{
for (int i = 0; i < MAX_SAMPLES; i++)
{
val1[i] = 50 + amp * sin(stp * i);
}
}
void setup()
{
lcd.begin(16, 2);
pinMode(out1, PWM);
pinMode(PB13, INPUT_PULLDOWN);
pinMode(PB12, INPUT_PULLDOWN);
timer_conf();
dma_conf();
dma_start();
init_wave();
}
void loop()
{
ReadButtons();
dma_conf(); // Update the number of samples
lcd.setCursor(0, 1);
lcd.print("Samples = ");
lcd.print(Samples);
delay(100);
}
//////////////////////////////////
void ReadButtons()
{
if (digitalRead(PB12) == HIGH)
{
if (Samples < MAX_SAMPLES)
{
Samples++;
}
}
if (digitalRead(PB13) == HIGH)
{
if (Samples > 0)
{
Samples--;
}
}
}
/////////////////////////////