add DPCM dac + LED servicing

This commit is contained in:
sigil-03 2025-08-10 13:09:47 -06:00
parent 0ac166bf5e
commit 85077d4f1e
4 changed files with 133 additions and 20 deletions

View file

@ -3,6 +3,7 @@
#![feature(type_alias_impl_trait)]
#![feature(impl_trait_in_assoc_type)]
use adpcm_pwm_dac::dac::DpcmDac;
use hal::delay::Delay;
use hal::gpio::{AnyPin, Level, Output, Pin};
use {ch32_hal as hal};
@ -14,6 +15,22 @@ use hal::timer::{Channel, GeneralInstance16bit};
// const DAC_DATA: [u8; 4] = [0x0, 0x80, 0xFF, 0x80];
const DAC_DATA: [u8; 8] = [0, 25, 50, 75, 100, 75, 50, 25];
// DPCS DATA
// step size: 5
// 0
// + 25 -> [1, 0, 1, 1] -> 0xB
// + 25 -> 0xB
// + 25 -> 0xB
// + 25 -> 0xB
// - 25 -> 0xA
// - 25 -> 0xA
// - 25 -> 0xA
const DPCM_DAC_DATA: [u8; 4] = [0xBB, 0xBB, 0xAA, 0xAA];
// const DATA2: [u8; 1] = [0x00u8];
struct SimplePwmDacPin<'d, T: GeneralInstance16bit>{
pin: SimplePwm<'d, T>,
ch: Channel,
@ -65,26 +82,47 @@ fn pwm_blink<T: GeneralInstance16bit>(mut pwm_dac_pin: SimplePwmDacPin<'_, T>) {
}
}
fn dac_run<T: DacInterface>(mut dac: Dac<'_, T>, sample_rate: usize) {
let mut delay = Delay;
// // fn dac_run<T: DacInterface>(mut dac: Dac<'_, T>, sample_rate: usize) {
// fn dac_run<T: DacInterface>(mut dac: DpcmDac<'_, T>, sample_rate: usize) {
// dac.load_data(data);
// // dac.load_data(&DAC_DATA);
dac.load_data(&DAC_DATA);
// let interval_us = 1000000/sample_rate as u32;
// loop {
let interval_us = 1000000/sample_rate as u32;
loop {
dac.output_next();
delay.delay_us(interval_us);
}
}
// }
// }
#[qingke_rt::entry]
fn main() -> ! {
let mut config = hal::Config::default();
config.rcc = hal::rcc::Config::SYSCLK_FREQ_48MHZ_HSE;
let p = hal::init(config);
// let led_pin = PwmPin::new_ch4::<0>(p.PD0);
// let ch = hal::timer::Channel::Ch4;
// let mut pwm = SimplePwm::new(
// p.TIM1,
// None,
// None,
// None,
// Some(pin),
// Hertz::khz(100),
// CountingMode::default(),
// );
// pwm.enable(ch);
//
// LED output setup
let mut led = Output::new(p.PD0, Level::Low, Default::default());
// PWM DAC output pin setup
let pin = PwmPin::new_ch4::<0>(p.PC4);
let ch = hal::timer::Channel::Ch4;
let mut pwm = SimplePwm::new(
@ -93,19 +131,51 @@ fn main() -> ! {
None,
None,
Some(pin),
Hertz::khz(24),
Hertz::khz(100),
CountingMode::default(),
);
pwm.enable(ch);
let mut pwm_dac_pin = SimplePwmDacPin{pin: pwm, ch};
let mut dac = Dac::new(pwm_dac_pin);
let sample_rate_hz = 440 * DAC_DATA.len();
// pwm_blink(pwm_dac_pin);
dac_run(dac, sample_rate_hz);
blink(p.PD6.degrade(), 100);
loop{};
let mut delay = Delay;
// DAC setup
let mut dac = DpcmDac::new(pwm_dac_pin);
let data = include_bytes!("../../../dpcm-encoder-decoder/sweep_dpcm_u4.raw");
dac.load_data(data);
// DAC servicer computations
let mut dac_active = true;
let sample_rate_hz = 16000;
let dac_tick_per_service = 5;
let tick_rate_hz = sample_rate_hz * dac_tick_per_service;
let tick_interval = 1000000/(tick_rate_hz);
// LED servicer computations
let mut led_active = true;
let led_blink_rate_hz = 3;
let led_tick_per_service = (tick_rate_hz/(led_blink_rate_hz * 2));
// pwm_blink(pwm_dac_pin);
let mut tick: usize = 0;
loop{
let dac_need_service = ((tick % dac_tick_per_service) == 0);
if(dac_need_service && dac_active) {
dac_active = dac.output_next();
}
let led_need_service = ((tick % led_tick_per_service) == 0);
if(led_need_service && led_active) {
led.toggle();
}
tick = tick.wrapping_add(1);
delay.delay_us(tick_interval as u32);
};
}