set sampling rate

pull/3/head
Clyne 4 years ago
parent 4b523f98c8
commit 2c9892cc3e

@ -100,10 +100,10 @@ include $(CHIBIOS)/os/license/license.mk
include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32l4xx.mk
# HAL-OSAL files (optional).
include $(CHIBIOS)/os/hal/hal.mk
include $(CHIBIOS)/os/hal/ports/STM32/STM32L4xx/platform.mk
include $(CHIBIOS)/os/hal/boards/ST_STM32L476_DISCOVERY/board.mk
#include $(CHIBIOS)/os/hal/boards/ST_NUCLEO32_L432KC/board.mk
#include $(CHIBIOS)/os/hal/ports/STM32/STM32L4xx/platform_l432.mk
#include $(CHIBIOS)/os/hal/ports/STM32/STM32L4xx/platform.mk
#include $(CHIBIOS)/os/hal/boards/ST_STM32L476_DISCOVERY/board.mk
include $(CHIBIOS)/os/hal/boards/ST_NUCLEO32_L432KC/board.mk
include $(CHIBIOS)/os/hal/ports/STM32/STM32L4xx/platform_l432.mk
include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk
# RTOS files (optional).
include $(CHIBIOS)/os/rt/rt.mk
@ -116,8 +116,8 @@ include $(CHIBIOS)/tools/mk/autobuild.mk
#include $(CHIBIOS)/test/oslib/oslib_test.mk
# Define linker script file here.
LDSCRIPT= $(STARTUPLD)/STM32L476xG.ld
#LDSCRIPT= $(STARTUPLD)/STM32L432xC.ld
#LDSCRIPT= $(STARTUPLD)/STM32L476xG.ld
LDSCRIPT= $(STARTUPLD)/STM32L432xC.ld
# C sources that can be compiled in ARM or THUMB mode depending on the global
# setting.

@ -32,8 +32,9 @@
#define MCUCONF_H
#define STM32L4xx_MCUCONF
#define STM32L476_MCUCONF
//#define STM32L432_MCUCONF
//#define STM32L476_MCUCONF
#define STM32L432_MCUCONF
//#define STM32L433_MCUCONF
/*
* HAL driver system settings.

@ -52,6 +52,16 @@ namespace stmdsp
}
}
void device::set_sample_rate(unsigned int id) {
if (connected()) {
uint8_t request[2] = {
'r',
static_cast<uint8_t>(id)
};
m_serial.write(request, 2);
}
}
void device::continuous_start() {
if (connected())
m_serial.write("R");

@ -44,6 +44,7 @@ namespace stmdsp
//std::vector<adcsample_t> sample(unsigned long int count = 1);
void continuous_set_buffer_size(unsigned int size);
void set_sample_rate(unsigned int id);
void continuous_start();
void continuous_start_measure();
uint32_t continuous_start_get_measurement();

@ -29,6 +29,7 @@ enum Id {
MRunUpload,
MRunUnload,
MRunEditBSize,
MRunEditSRate,
MRunGenUpload,
MRunGenStart,
MCodeCompile,
@ -106,6 +107,8 @@ MainFrame::MainFrame() : wxFrame(nullptr, wxID_ANY, "stmdspgui", wxPoint(50, 50)
menuRun->Append(MRunUnload, "U&nload code"));
Bind(wxEVT_MENU, &MainFrame::onRunEditBSize, this, Id::MRunEditBSize, wxID_ANY,
menuRun->Append(MRunEditBSize, "Set &buffer size..."));
Bind(wxEVT_MENU, &MainFrame::onRunEditSRate, this, Id::MRunEditSRate, wxID_ANY,
menuRun->Append(MRunEditSRate, "Set sample &rate..."));
menuRun->AppendSeparator();
Bind(wxEVT_MENU, &MainFrame::onRunGenUpload, this, Id::MRunGenUpload, wxID_ANY,
@ -439,6 +442,33 @@ void MainFrame::onRunEditBSize([[maybe_unused]] wxCommandEvent&)
}
}
void MainFrame::onRunEditSRate([[maybe_unused]] wxCommandEvent&)
{
if (m_device != nullptr && m_device->connected()) {
wxTextEntryDialog dialog (this, "Enter new sample rate id:", "Set Sample Rate");
if (dialog.ShowModal() == wxID_OK) {
if (wxString value = dialog.GetValue(); !value.IsEmpty()) {
if (unsigned long n; value.ToULong(&n)) {
if (n < 20) {
m_device->set_sample_rate(n);
} else {
m_status_bar->SetStatusText("Error: Invalid sample rate.");
}
} else {
m_status_bar->SetStatusText("Error: Invalid sample rate.");
}
} else {
m_status_bar->SetStatusText("Ready.");
}
} else {
m_status_bar->SetStatusText("Ready.");
}
} else {
wxMessageBox("No device connected!", "Run", wxICON_WARNING);
m_status_bar->SetStatusText("Please connect.");
}
}
void MainFrame::onRunGenUpload([[maybe_unused]] wxCommandEvent&)
{
if (m_device != nullptr && m_device->connected()) {

@ -37,6 +37,7 @@ public:
void onRunUpload(wxCommandEvent&);
void onRunUnload(wxCommandEvent&);
void onRunEditBSize(wxCommandEvent&);
void onRunEditSRate(wxCommandEvent&);
void onRunGenUpload(wxCommandEvent&);
void onRunGenStart(wxCommandEvent&);

@ -44,6 +44,32 @@ constexpr static const GPTConfig gpt_config = {
.dier = 0
};
static uint32_t adc_sample_rate_settings[] = {
10, ADC_SMPR_SMP_47P5, // 3125
11, ADC_SMPR_SMP_12P5, // 3750
9, ADC_SMPR_SMP_47P5, // 6250
10, ADC_SMPR_SMP_12P5, // 7500
8, ADC_SMPR_SMP_47P5, // 12K5
9, ADC_SMPR_SMP_12P5, // 15K
7, ADC_SMPR_SMP_47P5, // 25K
8, ADC_SMPR_SMP_12P5, // 30K
5, ADC_SMPR_SMP_47P5, // 40K
4, ADC_SMPR_SMP_47P5, // 50K
7, ADC_SMPR_SMP_12P5, // 60K
6, ADC_SMPR_SMP_12P5, // 80K
5, ADC_SMPR_SMP_12P5, // 96K
2, ADC_SMPR_SMP_47P5, // 100K
4, ADC_SMPR_SMP_12P5, // 120K
3, ADC_SMPR_SMP_12P5, // 160K
1, ADC_SMPR_SMP_47P5, // 200K
2, ADC_SMPR_SMP_12P5, // 240K
0, ADC_SMPR_SMP_47P5, // 400K
1, ADC_SMPR_SMP_12P5, // 480K
1, ADC_SMPR_SMP_2P5, // 800K
0, ADC_SMPR_SMP_12P5, // 960K
0, ADC_SMPR_SMP_2P5 // 1M6
};
static bool adc_is_read_finished = false;
static adcsample_t *adc_current_buffer = nullptr;
static size_t adc_current_buffer_size = 0;
@ -59,6 +85,19 @@ namespace adc
adcStart(adcd, &adc_config);
adcSTM32EnableVREF(adcd);
}
void set_rate(rate new_rate)
{
auto presc = adc_sample_rate_settings[static_cast<unsigned int>(new_rate) * 2] << 18;
auto smp = adc_sample_rate_settings[static_cast<unsigned int>(new_rate) * 2 + 1];
adcStop(adcd);
// Set ADC prescaler
adcd->adcc->CCR = (adcd->adcc->CCR & ~(0xF << 18)) | presc;
// Set sampling time
adc_group_config.smpr[0] = ADC_SMPR1_SMP_AN5(smp);
adcStart(adcd, &adc_config);
}
adcsample_t *read(adcsample_t *buffer, size_t count)
{
@ -94,42 +133,8 @@ namespace adc
adc_current_buffer_size = 0;
adc_operation_func = nullptr;
}
void set_rate(rate r)
{
uint32_t val = 0;
switch (r) {
case rate::R2P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_2P5);
break;
case rate::R6P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_6P5);
break;
case rate::R12P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_12P5);
break;
case rate::R24P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_24P5);
break;
case rate::R47P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_47P5);
break;
case rate::R92P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_92P5);
break;
case rate::R247P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_247P5);
break;
case rate::R640P5:
val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_640P5);
break;
}
adc_group_config.smpr[0] = val;
}
}
void adc_read_callback(ADCDriver *driver)
{
if (adc_group_config.circular) {

@ -18,23 +18,38 @@ namespace adc
{
using operation_t = void (*)(adcsample_t *buffer, size_t count);
enum class rate {
R2P5,
R6P5,
R12P5,
R24P5,
R47P5,
R92P5,
R247P5,
R640P5
enum class rate : unsigned int {
R3125 = 0,
R3750,
R6250,
R7500,
R12K5,
R15K,
R25K,
R30K,
R40K,
R50K,
R60K,
R80K,
R96K,
R100K,
R120K,
R160K,
R200K,
R240K,
R400K,
R480K,
R800K,
R960K,
R1M6
};
void init();
void set_rate(rate new_rate);
adcsample_t *read(adcsample_t *buffer, size_t count);
void read_start(operation_t operation_func, adcsample_t *buffer, size_t count);
void read_set_operation_func(operation_t operation_func);
void read_stop();
void set_rate(rate r);
}
#endif // STMDSP_ADC_HPP_

@ -253,14 +253,15 @@ void main_loop()
}
break;
//case 'r':
// if (usbserial::read(&cmd[1], 1) == 1) {
case 'r':
if (usbserial::read(&cmd[1], 1) == 1) {
adc::set_rate(static_cast<adc::rate>(cmd[1]));
// adc_preloaded = cmd[1] & (1 << 0);
// dac_preloaded = cmd[1] & (1 << 1);
// } else {
// error_queue_add(Error::BadParamSize);
// }
// break;
} else {
error_queue_add(Error::BadParamSize);
}
break;
// 'S' - Stops the continuous sampling/conversion.
case 'S':

Loading…
Cancel
Save