@ -7,7 +7,9 @@
# include "config.h"
# include "config.h"
TIM_HandleTypeDef TimHandle ;
TIM_HandleTypeDef TimHandle ;
TIM_HandleTypeDef TimHandle2 ;
uint8_t ppm_count = 0 ;
uint8_t ppm_count = 0 ;
uint8_t pwm_count = 0 ;
uint32_t timeout = 100 ;
uint32_t timeout = 100 ;
uint8_t nunchuk_data [ 6 ] = { 0 } ;
uint8_t nunchuk_data [ 6 ] = { 0 } ;
@ -84,6 +86,143 @@ void PPM_Init(void) {
}
}
# endif
# endif
# ifdef BUTTONS_RIGHT
uint8_t btn1 = 0 ;
uint8_t btn2 = 0 ;
void BUTTONS_RIGHT_Init ( ) {
GPIO_InitTypeDef GPIO_InitStruct ;
/*Configure GPIO pin : PB10 */
GPIO_InitStruct . Pin = GPIO_PIN_10 ;
GPIO_InitStruct . Mode = GPIO_MODE_INPUT ;
GPIO_InitStruct . Speed = GPIO_SPEED_FREQ_MEDIUM ;
GPIO_InitStruct . Pull = GPIO_PULLUP ;
HAL_GPIO_Init ( GPIOB , & GPIO_InitStruct ) ;
btn1 = ! HAL_GPIO_ReadPin ( GPIOB , GPIO_PIN_10 ) ;
GPIO_InitTypeDef GPIO_InitStruct2 ;
/*Configure GPIO pin : PB11 */
GPIO_InitStruct2 . Pin = GPIO_PIN_11 ;
GPIO_InitStruct2 . Mode = GPIO_MODE_INPUT ;
GPIO_InitStruct2 . Speed = GPIO_SPEED_FREQ_MEDIUM ;
GPIO_InitStruct2 . Pull = GPIO_PULLUP ;
HAL_GPIO_Init ( GPIOB , & GPIO_InitStruct2 ) ;
btn2 = ! HAL_GPIO_ReadPin ( GPIOB , GPIO_PIN_11 ) ;
}
# endif
# ifdef CONTROL_PWM
//uint16_t pwm_captured_ch1_value = 500;
uint16_t pwm_captured_ch2_value = 500 ;
uint32_t pwm_timeout = 0 ;
# define IN_RANGE(x, low, up) (((x) >= (low)) && ((x) <= (up)))
int PWM_Signal_Correct ( int16_t x , int16_t max , int16_t min ) {
int outVal = 0 ;
if ( x > - PWM_DEADBAND & & x < PWM_DEADBAND ) {
outVal = 0 ;
} else if ( x > 0 ) {
outVal = ( float ) CLAMP ( x - PWM_DEADBAND , 0 , max - PWM_DEADBAND ) / ( max - PWM_DEADBAND ) * 1000 ;
} else {
outVal = 0 - ( ( float ) CLAMP ( x + PWM_DEADBAND , min + PWM_DEADBAND , 0 ) / ( min + PWM_DEADBAND ) * 1000 ) ;
}
return outVal ;
}
/*
void PWM_ISR_CH1_Callback ( void ) {
// Dummy loop with 16 bit count wrap around
uint16_t rc_signal = TIM3 - > CNT ;
TIM3 - > CNT = 0 ;
if ( IN_RANGE ( rc_signal , 900 , 2100 ) ) {
timeout = 0 ;
pwm_timeout = 0 ;
pwm_captured_ch1_value = CLAMP ( rc_signal , 1000 , 2000 ) - 1000 ;
}
}
*/
void PWM_ISR_CH2_Callback ( void ) {
// Dummy loop with 16 bit count wrap around
uint16_t rc_signal = TIM2 - > CNT ;
TIM2 - > CNT = 0 ;
if ( IN_RANGE ( rc_signal , 900 , 2100 ) ) {
timeout = 0 ;
pwm_timeout = 0 ;
pwm_captured_ch2_value = CLAMP ( rc_signal , 1000 , 2000 ) - 1000 ;
}
}
// SysTick executes once each ms
void PWM_SysTick_Callback ( void ) {
pwm_timeout + + ;
// Stop after 500 ms without PPM signal
if ( pwm_timeout > 500 ) {
//pwm_captured_ch1_value = 500;
pwm_captured_ch2_value = 500 ;
pwm_timeout = 0 ;
}
}
void PWM_Init ( void ) {
// Channel 1 (steering)
/*
GPIO_InitTypeDef GPIO_InitStruct2 ;
// Configure GPIO pin : PA2
GPIO_InitStruct2 . Pin = GPIO_PIN_2 ;
GPIO_InitStruct2 . Mode = GPIO_MODE_IT_RISING_FALLING ;
GPIO_InitStruct2 . Speed = GPIO_SPEED_FREQ_HIGH ;
GPIO_InitStruct2 . Pull = GPIO_PULLDOWN ;
HAL_GPIO_Init ( GPIOA , & GPIO_InitStruct2 ) ;
__HAL_RCC_TIM3_CLK_ENABLE ( ) ;
TimHandle2 . Instance = TIM3 ;
TimHandle2 . Init . Period = UINT16_MAX ;
TimHandle2 . Init . Prescaler = ( SystemCoreClock / DELAY_TIM_FREQUENCY_US ) - 1 ; ;
TimHandle2 . Init . ClockDivision = 0 ;
TimHandle2 . Init . CounterMode = TIM_COUNTERMODE_UP ;
HAL_TIM_Base_Init ( & TimHandle2 ) ;
// EXTI interrupt init
HAL_NVIC_SetPriority ( EXTI2_IRQn , 0 , 0 ) ;
HAL_NVIC_EnableIRQ ( EXTI2_IRQn ) ;
HAL_TIM_Base_Start ( & TimHandle2 ) ;
*/
// Channel 2 (speed)
GPIO_InitTypeDef GPIO_InitStruct ;
/*Configure GPIO pin : PA3 */
GPIO_InitStruct . Pin = GPIO_PIN_3 ;
GPIO_InitStruct . Mode = GPIO_MODE_IT_RISING_FALLING ;
GPIO_InitStruct . Speed = GPIO_SPEED_FREQ_HIGH ;
GPIO_InitStruct . Pull = GPIO_PULLDOWN ;
HAL_GPIO_Init ( GPIOA , & GPIO_InitStruct ) ;
__HAL_RCC_TIM2_CLK_ENABLE ( ) ;
TimHandle . Instance = TIM2 ;
TimHandle . Init . Period = UINT16_MAX ;
TimHandle . Init . Prescaler = ( SystemCoreClock / DELAY_TIM_FREQUENCY_US ) - 1 ; ;
TimHandle . Init . ClockDivision = 0 ;
TimHandle . Init . CounterMode = TIM_COUNTERMODE_UP ;
HAL_TIM_Base_Init ( & TimHandle ) ;
/* EXTI interrupt init*/
HAL_NVIC_SetPriority ( EXTI3_IRQn , 0 , 0 ) ;
HAL_NVIC_EnableIRQ ( EXTI3_IRQn ) ;
HAL_TIM_Base_Start ( & TimHandle ) ;
}
# endif
uint8_t Nunchuk_Ping ( void ) {
uint8_t Nunchuk_Ping ( void ) {
if ( HAL_I2C_Master_Receive ( & hi2c2 , 0xA4 , ( uint8_t * ) nunchuk_data , 1 , 10 ) = = HAL_OK ) {
if ( HAL_I2C_Master_Receive ( & hi2c2 , 0xA4 , ( uint8_t * ) nunchuk_data , 1 , 10 ) = = HAL_OK ) {
return 1 ;
return 1 ;