// // hello.speaker.D11C.ino // // speaker D11C hello-world // // Neil Gershenfeld 11/6/22 // // This work may be reproduced, modified, distributed, // performed, and displayed for any purpose, but must // acknowledge this project. Copyright is retained and // must be preserved. The work is provided as is; no // warranty is provided, and users accept all liability. // #define delay(n) {volatile uint32_t i; for (i = 0; i < n; ++i) {}} #define pwm_cycle_sec 5.7e-6 // for on+off count = 10 void setup() { REG_PORT_DIR0 = PORT_PA05; // set pin to output } void loop() { // // 1 kHz square wave // uint32_t frequency_Hz = 1000; float ontime_sec = 1; uint32_t wave_cycle,wave_cycle_count = frequency_Hz*ontime_sec; uint32_t on_count = 5,off_count = 5; uint32_t pwm_cycle,pwm_cycle_count = 1/(frequency_Hz*pwm_cycle_sec); for (wave_cycle = 0; wave_cycle < wave_cycle_count; ++wave_cycle) { for (pwm_cycle = 0; pwm_cycle < pwm_cycle_count; ++pwm_cycle) { PORT_IOBUS->Group[0].OUTSET.reg = PORT_PA05; delay(on_count) PORT_IOBUS->Group[0].OUTCLR.reg = PORT_PA05; delay(off_count) } for (pwm_cycle = 0; pwm_cycle < pwm_cycle_count; ++pwm_cycle) { PORT_IOBUS->Group[0].OUTCLR.reg = PORT_PA05; delay(on_count) PORT_IOBUS->Group[0].OUTCLR.reg = PORT_PA05; delay(off_count) } } // // 500 Hz square wave // frequency_Hz = 500; ontime_sec = 1; wave_cycle_count = frequency_Hz*ontime_sec; on_count = 5,off_count = 5; pwm_cycle_count = 1/(frequency_Hz*pwm_cycle_sec); for (wave_cycle = 0; wave_cycle < wave_cycle_count; ++wave_cycle) { for (pwm_cycle = 0; pwm_cycle < pwm_cycle_count; ++pwm_cycle) { PORT_IOBUS->Group[0].OUTSET.reg = PORT_PA05; delay(on_count) PORT_IOBUS->Group[0].OUTCLR.reg = PORT_PA05; delay(off_count) } for (pwm_cycle = 0; pwm_cycle < pwm_cycle_count; ++pwm_cycle) { PORT_IOBUS->Group[0].OUTCLR.reg = PORT_PA05; delay(on_count) PORT_IOBUS->Group[0].OUTCLR.reg = PORT_PA05; delay(off_count) } } // // 1 kHz square wave, reduce volume // frequency_Hz = 1000; ontime_sec = 1; wave_cycle_count = frequency_Hz*ontime_sec; on_count = 2,off_count = 8; pwm_cycle_count = 1/(frequency_Hz*pwm_cycle_sec); for (wave_cycle = 0; wave_cycle < wave_cycle_count; ++wave_cycle) { for (pwm_cycle = 0; pwm_cycle < pwm_cycle_count; ++pwm_cycle) { PORT_IOBUS->Group[0].OUTSET.reg = PORT_PA05; delay(on_count) PORT_IOBUS->Group[0].OUTCLR.reg = PORT_PA05; delay(off_count) } for (pwm_cycle = 0; pwm_cycle < pwm_cycle_count; ++pwm_cycle) { PORT_IOBUS->Group[0].OUTCLR.reg = PORT_PA05; delay(on_count) PORT_IOBUS->Group[0].OUTCLR.reg = PORT_PA05; delay(off_count) } } // // 500 Hz square wave, reduce volume // frequency_Hz = 500; ontime_sec = 1; wave_cycle_count = frequency_Hz*ontime_sec; on_count = 2,off_count = 8; pwm_cycle_count = 1/(frequency_Hz*pwm_cycle_sec); for (wave_cycle = 0; wave_cycle < wave_cycle_count; ++wave_cycle) { for (pwm_cycle = 0; pwm_cycle < pwm_cycle_count; ++pwm_cycle) { PORT_IOBUS->Group[0].OUTSET.reg = PORT_PA05; delay(on_count) PORT_IOBUS->Group[0].OUTCLR.reg = PORT_PA05; delay(off_count) } for (pwm_cycle = 0; pwm_cycle < pwm_cycle_count; ++pwm_cycle) { PORT_IOBUS->Group[0].OUTCLR.reg = PORT_PA05; delay(on_count) PORT_IOBUS->Group[0].OUTCLR.reg = PORT_PA05; delay(off_count) } } }