#include "stdio.h"
|
#include "stdarg.h"
|
#include "string.h"
|
#include "pwm_ctrol.h"
|
#include "bluetooth.h"
|
#include "stm32h7xx_it.h"
|
#include "stm32h7xx_hal.h"
|
#include "main.h"
|
#include "mainex.h"
|
#include "DBG.h"
|
#include "Uart.h"
|
#include "HIDO_Util.h"
|
#include "SBUS.h"
|
|
#define STATE_WAIT_RISING 0
|
#define STATE_WAIT_FALLING 1
|
uint32_t rising_time = 0;
|
uint32_t falling_time = 0;
|
uint32_t pulse_width_us = 0;
|
uint8_t capture_state = STATE_WAIT_RISING;;
|
|
|
|
|
// �������е����ָ��ռ�ձ�
|
void set_all_pwm(uint16_t duty)
|
{
|
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty);
|
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, duty);
|
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, duty);
|
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, duty);
|
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, duty);
|
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, duty);
|
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, duty);
|
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, duty);
|
}
|
|
// ����ǰ����ת��������ת
|
void set_pwm_left()
|
{
|
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 1000); // ǰ��
|
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 2000); // ǰ��
|
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 2000); // ����
|
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 1000); // ����
|
}
|
|
// ���ң�ǰ����ת��������ת
|
void set_pwm_right()
|
{
|
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 2000); // ǰ��
|
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 1000); // ǰ��
|
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 1000); // ����
|
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 2000); // ����
|
}
|
|
|
// ӳ�亯������ [-100,100] ӳ�䵽 [1000,2000]
|
uint32_t Map(int16_t input, int16_t in_min, int16_t in_max, uint32_t out_min, uint32_t out_max)
|
{
|
return (input - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
}
|
// ���õ�� PWM��ǰ��/���ˣ�
|
void Set_Motor_PWM(int16_t speed)
|
{
|
static HIDO_UINT8 l_Motor[50];
|
uint32_t pulse = Map(speed, -100, 100, 1000, 2000); // -100~100 �� 1000~2000
|
__HAL_TIM_SetCompare(&MOTOR_TIM, MOTOR_CHANNEL, pulse);
|
HIDO_UtilSnprintf((HIDO_CHAR *)l_Motor, sizeof(l_Motor), "Motor cortrol:speed=%d,pulse=%d\r\n", speed,pulse);
|
Uart_Send(UART_ID_DBG, (HIDO_UINT8 *)l_Motor, strlen(l_Motor));
|
}
|
|
// ����ת�� PWM����ת/��ת��
|
void Set_Steering_PWM(int16_t steer)
|
{
|
static HIDO_UINT8 l_Steering[50];
|
uint32_t pulse = Map(steer, -100, 100, 1000, 2000); // -100~100 �� 1000~2000
|
__HAL_TIM_SetCompare(&STEERING_TIM, STEERING_CHANNEL, pulse);
|
HIDO_UtilSnprintf((HIDO_CHAR *)l_Steering, sizeof(l_Steering), "Steering cortrol:steer=%d,pulse=%d\r\n", steer,pulse);
|
Uart_Send(UART_ID_DBG, (HIDO_UINT8 *)l_Steering, strlen(l_Steering));
|
|
}
|
|
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
|
{
|
static HIDO_UINT8 l_pulse_width[20];
|
|
if (htim->Instance == TIM4)
|
{
|
uint32_t current_time = htim->Instance->CCR1;
|
|
if (capture_state == STATE_WAIT_RISING)
|
{
|
// ��ǰ�������� �� ��¼���л����ȴ��½���
|
rising_time = current_time;
|
// �л�Ϊ�½��ش���
|
htim->Instance->CCER &= ~TIM_CCER_CC1P; // ������
|
htim->Instance->CCER |= TIM_CCER_CC1NP; // ���� NP ��ʾ�Ƿ��ࣿʵ��Ӧʹ�ü��Կ��ƺ���
|
|
// ���Ƽ�ʹ�� HAL �������ü���
|
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
|
|
capture_state = STATE_WAIT_FALLING;
|
}
|
else if (capture_state == STATE_WAIT_FALLING)
|
{
|
// ��ǰ���½��� �� ����ߵ�ƽ����
|
uint32_t pulse_width = current_time - rising_time;
|
|
if (pulse_width > 65535) // ����������ֵ
|
{
|
pulse_width = 0; // ���߱��Ϊ��Ч
|
}
|
|
//printf("High Pulse Width: %lu ��s\n", pulse_width);
|
HIDO_UtilSnprintf((HIDO_CHAR *)l_pulse_width, sizeof(l_pulse_width), "pulse_width=%d\r\n", pulse_width);
|
Uart_Send(UART_ID_DBG, (HIDO_UINT8 *)l_pulse_width, strlen(l_pulse_width));
|
// �л������ش���
|
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
|
capture_state = STATE_WAIT_RISING;
|
}
|
|
// ����жϱ�־
|
__HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1);
|
}
|
}
|
uint32_t steering_pulse,motor_pulse;
|
void SBUS_Control_PWM(void)
|
{
|
ST_SBUSData sbusData;
|
|
// 获取 SBUS 数据
|
if (SBUS_GetData(&sbusData) != HIDO_TRUE)
|
{
|
return; // 没有有效数据
|
}
|
|
// CH0: 转向通道 (200-1800) -> (1000-2000us)
|
uint16_t ch0 = sbusData.m_au16Channels[0];
|
if (ch0 < 200) ch0 = 200;
|
if (ch0 > 1800) ch0 = 1800;
|
steering_pulse = ((ch0 - 200) * 1000) / 1600 + 1000;
|
|
// CH1: 行进通道 (200-1800) -> (1000-2000us)
|
uint16_t ch1 = sbusData.m_au16Channels[1];
|
if (ch1 < 200) ch1 = 200;
|
if (ch1 > 1800) ch1 = 1800;
|
motor_pulse = ((ch1 - 200) * 1000) / 1600 + 1000;
|
|
// 设置 PWM 输出
|
__HAL_TIM_SetCompare(&STEERING_TIM, STEERING_CHANNEL, steering_pulse);
|
__HAL_TIM_SetCompare(&MOTOR_TIM, MOTOR_CHANNEL, motor_pulse);
|
}
|
|
// 直接设置脉宽(微秒)
|
void Set_Steering_Pulse(uint32_t pulse_us)
|
{
|
steering_pulse = pulse_us;
|
__HAL_TIM_SetCompare(&STEERING_TIM, STEERING_CHANNEL, steering_pulse);
|
}
|
|
void Set_Motor_Pulse(uint32_t pulse_us)
|
{
|
motor_pulse = pulse_us;
|
__HAL_TIM_SetCompare(&MOTOR_TIM, MOTOR_CHANNEL, motor_pulse);
|
}
|
#if 0
|
/**
|
* @brief Update Callback (for overflow protection)
|
*/
|
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
{
|
if (htim->Instance == TIM4)
|
{
|
// ֻ�ڳ�ʱ������Ӧʱ������״̬
|
static uint32_t last_reset_ms = 0;
|
|
if (HAL_GetTick() - last_reset_ms > 100) // 100ms ��ʱ
|
{
|
capture_state = 0;
|
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
|
last_reset_ms = HAL_Get_Tick();
|
printf("TIM4 Overflow Reset (timeout)\r\n");
|
}
|
}
|
}
|
|
#endif
|
#if 0
|
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
|
{
|
if (htim->Instance == TIM4 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
|
{
|
uint32_t current_value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
|
|
if (capture_state == 0)
|
{
|
// �����أ���¼��ʼʱ��
|
rising_time = current_value;
|
printf("Rising Edge: %lu\r\n", rising_time);
|
|
// �л�Ϊ�½��ؼ��
|
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
|
capture_state = 1;
|
}
|
else if (capture_state == 1)
|
{
|
// �½��أ���������
|
falling_time = current_value;
|
pulse_width_us = falling_time - rising_time;
|
|
// ��ֹ��������ֹ�����
|
if (pulse_width_us > 65535) // ����������ֵ
|
{
|
pulse_width_us = 0; // ���߱��Ϊ��Ч
|
}
|
|
printf("Falling Edge: %lu\r\n", falling_time);
|
printf("Pulse Width: %lu ��s\r\n", pulse_width_us);
|
|
// ��������Ϊ�����أ��ȴ���һ������
|
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
|
capture_state = 0;
|
}
|
}
|
}
|
#endif
|