- some refactoring (relocate measuring of control signal)
- add first draft of gain control
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
@@ -1,3 +0,0 @@
|
||||
float calculate_amplitude();
|
||||
float calculate_frequency();
|
||||
void capture_samples(void);
|
@@ -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
20
general/gain_control.c
Normal 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);
|
||||
}
|
1
general/include/gain_control.h
Normal file
1
general/include/gain_control.h
Normal file
@@ -0,0 +1 @@
|
||||
void check_gain(void);
|
6
general/include/measure.h
Normal file
6
general/include/measure.h
Normal 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
62
general/measure.c
Normal 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;
|
||||
}
|
Reference in New Issue
Block a user