add piezo-buzzer controller using PWM
This commit is contained in:
parent
d04212b8ff
commit
4bdc673561
46
main.c
46
main.c
|
@ -62,10 +62,16 @@ volatile uint8_t rtc_seconds = 0; /**< number of seconds passed incremented by t
|
||||||
#define STANDBY_TIMEOUT 30 /**< number of seconds after last shake before going down */
|
#define STANDBY_TIMEOUT 30 /**< number of seconds after last shake before going down */
|
||||||
volatile uint16_t standby_timer = 0; /**< number of seconds since last wake-up/activity */
|
volatile uint16_t standby_timer = 0; /**< number of seconds since last wake-up/activity */
|
||||||
|
|
||||||
#define FRAME_TIMER 1 /**< timer to count frame time */
|
#define FRAME_TIMER 2 /**< timer to count frame time */
|
||||||
#define FRAME_RATE 25 /**< frame rate */
|
#define FRAME_RATE 25 /**< frame rate */
|
||||||
volatile uint8_t frame_count = 0; /**< number of frames passed */
|
volatile uint8_t frame_count = 0; /**< number of frames passed */
|
||||||
|
|
||||||
|
#define BUZZER_TIMER 1 /**< timer to generate scene and take count */
|
||||||
|
#define BUZZER_1_PORT A /**< use timer 1 channel 1 (and it's negative) to driver buzzer */
|
||||||
|
#define BUZZER_1_PIN 7 /**< use timer 1 channel 1 (and it's negative) to driver buzzer */
|
||||||
|
#define BUZZER_2_PORT A /**< use timer 1 channel 1 (and it's negative) to driver buzzer */
|
||||||
|
#define BUZZER_2_PIN 8 /**< use timer 1 channel 1 (and it's negative) to driver buzzer */
|
||||||
|
|
||||||
#define MUX_EN_PORT B /**< port to enable multiplexer */
|
#define MUX_EN_PORT B /**< port to enable multiplexer */
|
||||||
#define MUX_EN_PIN 9 /**< pin to enable multiplexer */
|
#define MUX_EN_PIN 9 /**< pin to enable multiplexer */
|
||||||
#define MUX_S0_PORT B /**< port to select multiplexer output */
|
#define MUX_S0_PORT B /**< port to select multiplexer output */
|
||||||
|
@ -281,7 +287,7 @@ void main(void)
|
||||||
usart_setup(); // setup USART for user communication
|
usart_setup(); // setup USART for user communication
|
||||||
cdcacm_setup(); // setup USB ACM (serial) for user communication
|
cdcacm_setup(); // setup USB ACM (serial) for user communication
|
||||||
gpio_primary_remap(AFIO_MAPR_SWJ_CFG_JTAG_OFF_SW_ON,0); // disable JTAG (but leave SWD on) since we need most of the GPIOs
|
gpio_primary_remap(AFIO_MAPR_SWJ_CFG_JTAG_OFF_SW_ON,0); // disable JTAG (but leave SWD on) since we need most of the GPIOs
|
||||||
printf("welcome to the CuVoodoo clapperboard\n"); // print welcome message
|
printf("\nwelcome to the CuVoodoo clapperboard\n"); // print welcome message
|
||||||
|
|
||||||
#if !(DEBUG)
|
#if !(DEBUG)
|
||||||
// show watchdog information
|
// show watchdog information
|
||||||
|
@ -394,6 +400,28 @@ void main(void)
|
||||||
timer_enable_counter(TIM(FRAME_TIMER)); // enable timer to start counting frames
|
timer_enable_counter(TIM(FRAME_TIMER)); // enable timer to start counting frames
|
||||||
printf("OK\n");
|
printf("OK\n");
|
||||||
|
|
||||||
|
// setup PWM for piezo-buzzer
|
||||||
|
printf("setup piezo-buzzer timer: ");
|
||||||
|
rcc_periph_clock_enable(RCC_GPIO(BUZZER_1_PORT)); // enable clock for GPIO peripheral
|
||||||
|
rcc_periph_clock_enable(RCC_AFIO); // enable clock for alternate function (PWM)
|
||||||
|
gpio_primary_remap(AFIO_MAPR_SWJ_MASK, AFIO_MAPR_TIM1_REMAP_PARTIAL_REMAP); // remap TIM1_CH1N to PA7 instead of PB13
|
||||||
|
gpio_set_mode(GPIO(BUZZER_1_PORT), GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO(BUZZER_1_PIN)); // set pin as output to have a PWM to driver piezo buzzer
|
||||||
|
rcc_periph_clock_enable(RCC_GPIO(BUZZER_2_PORT)); // enable clock for GPIO peripheral
|
||||||
|
gpio_set_mode(GPIO(BUZZER_2_PORT), GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO(BUZZER_2_PIN)); // set pin as output to have a PWM to driver piezo buzzer
|
||||||
|
rcc_periph_clock_enable(RCC_TIM(BUZZER_TIMER)); // enable clock for timer peripheral
|
||||||
|
timer_reset(TIM(BUZZER_TIMER)); // reset timer state
|
||||||
|
timer_set_mode(TIM(BUZZER_TIMER), TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP); // set timer mode, use undivided timer clock, edge alignment (simple count), and count up
|
||||||
|
timer_set_prescaler(TIM(BUZZER_TIMER), 0); // no prescaler to keep most precise timer (72MHz/2^16=1099<2kHz)
|
||||||
|
timer_set_period(TIM(BUZZER_TIMER), rcc_ahb_frequency/2000-1); // set the PWM frequency to 2kHz for piezo-buzzer
|
||||||
|
timer_set_oc_value(TIM(BUZZER_TIMER), TIM_OC1, rcc_ahb_frequency/2000/2-1); // duty cycle to 50% (also applies to TIM_OC1N)
|
||||||
|
// no preload is used, although the reference manual says to enable it
|
||||||
|
timer_set_oc_mode(TIM(BUZZER_TIMER), TIM_OC1, TIM_OCM_PWM1); // set timer to generate PWM (also applies to TIM_OC1N)
|
||||||
|
timer_enable_oc_output(TIM(BUZZER_TIMER), TIM_OC1); // enable output to generate PWM
|
||||||
|
timer_enable_oc_output(TIM(BUZZER_TIMER), TIM_OC1N); // enable output to generate PWM (complementary to be louder)
|
||||||
|
timer_enable_break_main_output(TIM(BUZZER_TIMER)); // enable master output
|
||||||
|
timer_generate_event(TIM(BUZZER_TIMER), TIM_EGR_UG); // generate update event to reload registers and reset counter
|
||||||
|
printf("OK\n");
|
||||||
|
|
||||||
// main loop
|
// main loop
|
||||||
printf("command input: ready\n");
|
printf("command input: ready\n");
|
||||||
bool action = false; // if an action has been performed don't go to sleep
|
bool action = false; // if an action has been performed don't go to sleep
|
||||||
|
@ -431,15 +459,6 @@ void main(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (button_flag) { // user pressed button
|
|
||||||
action = true; // action has been performed
|
|
||||||
printf("button pressed\n");
|
|
||||||
led_toggle(); // toggle LED
|
|
||||||
for (uint32_t i=0; i<1000000; i++) { // wait a bit to remove noise and double trigger
|
|
||||||
__asm__("nop");
|
|
||||||
}
|
|
||||||
button_flag = false; // reset flag
|
|
||||||
}
|
|
||||||
while (frame_flag) { // a frame has passed
|
while (frame_flag) { // a frame has passed
|
||||||
frame_flag = false; // reset flag
|
frame_flag = false; // reset flag
|
||||||
action = true; // action has been performed
|
action = true; // action has been performed
|
||||||
|
@ -465,6 +484,11 @@ void main(void)
|
||||||
rtc_tick_flag = false; // reset flag
|
rtc_tick_flag = false; // reset flag
|
||||||
action = true; // action has been performed
|
action = true; // action has been performed
|
||||||
led_toggle(); // toggle LED (good to indicate if main function is stuck)
|
led_toggle(); // toggle LED (good to indicate if main function is stuck)
|
||||||
|
if (rtc_seconds%2) {
|
||||||
|
timer_enable_counter(TIM(BUZZER_TIMER)); // start buzzing
|
||||||
|
} else {
|
||||||
|
timer_disable_counter(TIM(BUZZER_TIMER)); // start buzzing
|
||||||
|
}
|
||||||
if (standby_timer>=STANDBY_TIMEOUT) { // standby timeout complete
|
if (standby_timer>=STANDBY_TIMEOUT) { // standby timeout complete
|
||||||
// go into standby mode
|
// go into standby mode
|
||||||
printf("shutting down\n");
|
printf("shutting down\n");
|
||||||
|
|
Loading…
Reference in New Issue