Add multitone support for loudspeaker
This commit is contained in:
parent
e97092042b
commit
355e81ba44
@ -27,6 +27,7 @@
|
||||
static const uint8_t digio_pins[] = {DIGIO_PINS};
|
||||
static const uint8_t digio_default_io[] = {DIGIO_INOUT_DEFAULT};
|
||||
static const uint8_t digio_default_altfunc[] = {DIGIO_ALTFUNC_DEFAULT};
|
||||
static uint16_t loudspeaker_val;
|
||||
|
||||
static void digio_setup_pin_int(uint8_t bit_no, uint8_t in_out, uint8_t alt_func)
|
||||
{
|
||||
@ -118,6 +119,19 @@ int led_get(uint8_t num)
|
||||
return ((LED_PORT->ODR & (1<<led_pins[num])) ? 1 : 0);
|
||||
}
|
||||
|
||||
|
||||
static void loudspeaker_freq_timer_init(void)
|
||||
{
|
||||
#if LOUDSPEAKER_MULTIFREQ
|
||||
rcc_manager_enable_clock(&RCC->APB1ENR, BITMASK_TO_BITNO(RCC_APB1ENR_TIM7EN));
|
||||
TIM7->CR1 = 0UL;
|
||||
TIM7->CR2 = 0UL;
|
||||
TIM7->PSC = 1000;
|
||||
TIM7->DIER = TIM_DIER_UIE;
|
||||
NVIC_EnableIRQ(TIM7_IRQn);
|
||||
#endif
|
||||
}
|
||||
|
||||
void loudspeaker_setup()
|
||||
{
|
||||
rcc_manager_enable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(LOUDSPEAKER_RCC_MASK));
|
||||
@ -125,16 +139,56 @@ void loudspeaker_setup()
|
||||
LOUDSPEAKER_PORT->MODER &= MODER_DELETE(LOUDSPEAKER_PIN);
|
||||
LOUDSPEAKER_PORT->MODER |= OUTPUT(LOUDSPEAKER_PIN);
|
||||
|
||||
loudspeaker_set(0);
|
||||
loudspeaker_freq_timer_init();
|
||||
loudspeaker_set(0U);
|
||||
}
|
||||
void loudspeaker_set(int val)
|
||||
|
||||
static void loudspeaker_start_beep(uint16_t val)
|
||||
{
|
||||
if (val)
|
||||
LOUDSPEAKER_PORT->ODR |= (1<<LOUDSPEAKER_PIN);
|
||||
else
|
||||
LOUDSPEAKER_PORT->ODR &= ~(1<<LOUDSPEAKER_PIN);
|
||||
#if LOUDSPEAKER_MULTIFREQ
|
||||
TIM7->ARR = val;
|
||||
TIM7->CNT = 0UL;
|
||||
TIM7->CR1 |= TIM_CR1_CEN;
|
||||
#else
|
||||
(void)val;
|
||||
LOUDSPEAKER_PORT->ODR |= (1<<LOUDSPEAKER_PIN);
|
||||
#endif
|
||||
}
|
||||
int loudspeaker_get()
|
||||
|
||||
static void loudspeaker_stop_beep(void)
|
||||
{
|
||||
return ((LOUDSPEAKER_PORT->ODR & (1<<LOUDSPEAKER_PIN)) ? 1 : 0);
|
||||
#if LOUDSPEAKER_MULTIFREQ
|
||||
TIM7->CR1 &= ~TIM_CR1_CEN;
|
||||
__DSB();
|
||||
TIM7->SR = 0UL;
|
||||
__DSB();
|
||||
LOUDSPEAKER_PORT->ODR &= ~(1<<LOUDSPEAKER_PIN);
|
||||
#else
|
||||
LOUDSPEAKER_PORT->ODR &= ~(1<<LOUDSPEAKER_PIN);
|
||||
#endif
|
||||
}
|
||||
|
||||
void loudspeaker_set(uint16_t val)
|
||||
{
|
||||
loudspeaker_val = val;
|
||||
|
||||
if (!val) {
|
||||
loudspeaker_stop_beep();
|
||||
} else {
|
||||
loudspeaker_start_beep(val);
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t loudspeaker_get()
|
||||
{
|
||||
return loudspeaker_val;
|
||||
}
|
||||
|
||||
#if LOUDSPEAKER_MULTIFREQ
|
||||
void TIM7_IRQHandler(void)
|
||||
{
|
||||
TIM7->SR = 0UL;
|
||||
__DSB();
|
||||
LOUDSPEAKER_PORT->ODR ^= (1<<LOUDSPEAKER_PIN);
|
||||
}
|
||||
#endif
|
||||
|
@ -58,10 +58,11 @@ int led_get(uint8_t num);
|
||||
#define LOUDSPEAKER_PORT GPIOB
|
||||
#define LOUDSPEAKER_RCC_MASK RCC_AHB1ENR_GPIOBEN
|
||||
#define LOUDSPEAKER_PIN 1
|
||||
#define LOUDSPEAKER_MULTIFREQ 1
|
||||
|
||||
void loudspeaker_setup();
|
||||
void loudspeaker_set(int val);
|
||||
int loudspeaker_get();
|
||||
void loudspeaker_set(uint16_t val);
|
||||
uint16_t loudspeaker_get();
|
||||
|
||||
|
||||
#endif /* __DIGIO_H__ */
|
||||
|
@ -259,7 +259,7 @@ int main()
|
||||
oven_driver_set_power(0U);
|
||||
|
||||
/* Activate loundspeaker permanently */
|
||||
loudspeaker_set(1);
|
||||
loudspeaker_set(100);
|
||||
} else if (pid_controller_active) {
|
||||
/* In case temperature measuremnt is okay and controlelr is working, write output power */
|
||||
oven_driver_set_power(pid_controller_output < 0 ? 0U : (uint8_t)pid_controller_output);
|
||||
|
Loading…
Reference in New Issue
Block a user