- some refactoring (relocate measuring of control signal)

- add first draft of gain control
This commit is contained in:
2024-07-20 23:22:29 +02:00
parent f47f394e47
commit bef0a1fdba
7 changed files with 92 additions and 58 deletions

View File

@@ -1,7 +1,6 @@
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include "hardware/adc.h"
#include <string.h>
@@ -11,15 +10,10 @@
#include "hardware/include/MCP45HVX1.h"
#include "general/include/fm-modulator.h"
// Constants
#define SAMPLE_RATE 100000 // 100 kHz sampling rate
#define NUM_SAMPLES 1000 // Number of samples to capture
MCP45HVX1_t pot;
// Global variables
uint16_t samples[NUM_SAMPLES];
int main(){
//initial sleep for programming
sleep_ms(3000);
@@ -61,51 +55,3 @@ int main(){
}
}
void capture_samples() {
for (int i = 0; i < NUM_SAMPLES; i++) {
samples[i] = adc_read();
sleep_us(1000000 / SAMPLE_RATE); // sleep for sampling period
}
}
float calculate_amplitude() {
uint16_t max_val = 0;
for (int i = 0; i < NUM_SAMPLES; i++) {
if (samples[i] > max_val) max_val = samples[i];
}
float peak = (float)max_val;
float amplitude = (peak / 4095.0f) * 3.3f; // 12-bit ADC
return amplitude;
}
float calculate_frequency() {
int zero_crossings[NUM_SAMPLES] = {0};
int zero_crossing_count = 0;
// Find zero crossings (positive going edges in the rectified waveform)
for (int i = 1; i < NUM_SAMPLES; i++) {
if (samples[i-1] < 2048 && samples[i] >= 2048) {
zero_crossings[zero_crossing_count++] = i;
}
}
// Calculate periods
if (zero_crossing_count < 2) return 0; // Not enough zero crossings detected
float periods[zero_crossing_count - 1];
for (int i = 1; i < zero_crossing_count; i++) {
periods[i - 1] = (zero_crossings[i] - zero_crossings[i - 1]) / (float)SAMPLE_RATE;
}
// Average period
float average_period = 0;
for (int i = 0; i < zero_crossing_count - 1; i++) {
average_period += periods[i];
}
average_period /= (zero_crossing_count - 1);
float frequency = 1.0f / average_period;
return frequency;
}

View File

@@ -1,3 +0,0 @@
float calculate_amplitude();
float calculate_frequency();
void capture_samples(void);

View File

@@ -90,6 +90,8 @@ add_executable(
hardware/DACx3204.c
hardware/MCP45HVX1.c
general/fm-modulator.c
general/measure.c
general/gain_control.c
)
pico_set_program_name(Autoradio-Zombie-Adapter "Autoradio-Zombie-Adapter")

20
general/gain_control.c Normal file
View File

@@ -0,0 +1,20 @@
#include "general/include/gain_control.h"
#include "general/include/measure.h"
float amplitude;
float max_amplitude = 3000;
float min_amplitude = 2000;
void check_gain(){
// Todo what happens if it never meets the conditions. like when there is no signal comming in or we are at max gain and the signal is still to low to be measured?
do{
capture_samples();
amplitude = calculate_amplitude();
if (amplitude > max_amplitude){
//TODO if Amplitude is to high
}
else if (amplitude < min_amplitude){
//TODO if Amplitude is to low
}
} while (amplitude < max_amplitude && amplitude > min_amplitude);
}

View File

@@ -0,0 +1 @@
void check_gain(void);

View File

@@ -0,0 +1,6 @@
#define SAMPLE_RATE 100000 // 100 kHz sampling rate
#define NUM_SAMPLES 1000 // Number of samples to capture
float calculate_amplitude();
float calculate_frequency();
void capture_samples(void);

62
general/measure.c Normal file
View File

@@ -0,0 +1,62 @@
#include "general/include/measure.h"
#include "general/include/gain_control.h"
#include "pico/stdlib.h"
#include "hardware/adc.h"
// Global variables
uint16_t samples[NUM_SAMPLES];
void measure_control_signal(){
check_gain();
calculate_amplitude();
calculate_frequency();
}
void capture_samples() {
for (int i = 0; i < NUM_SAMPLES; i++) {
samples[i] = adc_read();
sleep_us(1000000 / SAMPLE_RATE); // sleep for sampling period
}
}
float calculate_amplitude() {
uint16_t max_val = 0;
for (int i = 0; i < NUM_SAMPLES; i++) {
if (samples[i] > max_val) max_val = samples[i];
}
float peak = (float)max_val;
float amplitude = (peak / 4095.0f) * 3.3f; // 12-bit ADC
return amplitude;
}
float calculate_frequency() {
int zero_crossings[NUM_SAMPLES] = {0};
int zero_crossing_count = 0;
// Find zero crossings (positive going edges in the rectified waveform)
for (int i = 1; i < NUM_SAMPLES; i++) {
if (samples[i-1] < 2048 && samples[i] >= 2048) {
zero_crossings[zero_crossing_count++] = i;
}
}
// Calculate periods
if (zero_crossing_count < 2) return 0; // Not enough zero crossings detected
float periods[zero_crossing_count - 1];
for (int i = 1; i < zero_crossing_count; i++) {
periods[i - 1] = (zero_crossings[i] - zero_crossings[i - 1]) / (float)SAMPLE_RATE;
}
// Average period
float average_period = 0;
for (int i = 0; i < zero_crossing_count - 1; i++) {
average_period += periods[i];
}
average_period /= (zero_crossing_count - 1);
float frequency = 1.0f / average_period;
return frequency;
}