完成上报速度

This commit is contained in:
MQjehovah 2020-10-25 23:21:33 +08:00
parent 7e8ee6641d
commit f08e44509c
13 changed files with 256 additions and 208 deletions

View File

@ -16,7 +16,7 @@
<TargetCommonOption> <TargetCommonOption>
<Device>STM32F103C8</Device> <Device>STM32F103C8</Device>
<Vendor>STMicroelectronics</Vendor> <Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F1xx_DFP.2.2.0</PackID> <PackID>Keil.STM32F1xx_DFP.2.3.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL> <PackURL>http://www.keil.com/pack/</PackURL>
<Cpu>IROM(0x08000000,0x10000) IRAM(0x20000000,0x5000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE</Cpu> <Cpu>IROM(0x08000000,0x10000) IRAM(0x20000000,0x5000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec> <FlashUtilSpec></FlashUtilSpec>

View File

@ -63,11 +63,8 @@ void ADC_Config(void)
*******************************************************************************/ *******************************************************************************/
void ADC1_2_IRQHandler(void) void ADC1_2_IRQHandler(void)
{ {
static u8 i = 0, x = 0, y = 0;
if (ADC1->SR & ADC_FLAG_JEOC) if (ADC1->SR & ADC_FLAG_JEOC)
{ {
// LED_GR = !LED_GR;
ADC1->SR &= ~(ADC_FLAG_JEOC); ADC1->SR &= ~(ADC_FLAG_JEOC);
Cur_ADC = (short int)ADC1->JDR1; Cur_ADC = (short int)ADC1->JDR1;
Temp_ADC = (short int)ADC1->JDR2; Temp_ADC = (short int)ADC1->JDR2;

View File

@ -8,8 +8,14 @@
* @attention * @attention
*******************************************************************************/ *******************************************************************************/
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "adc.h" #include "can.h"
#include "motor.h"
/* Definition ----------------------------------------------------------------*/ /* Definition ----------------------------------------------------------------*/
// can_message_t can_tx_message;
// can_message_t can_rx_message;
CanTxMsg TxMessage = {0};
CanRxMsg RxMessage;
extern short int Cur_ADC; extern short int Cur_ADC;
extern short int Temp_ADC; extern short int Temp_ADC;
/* Functions -----------------------------------------------------------------*/ /* Functions -----------------------------------------------------------------*/
@ -17,16 +23,16 @@ extern short int Temp_ADC;
* @brief CAN1初始化 * @brief CAN1初始化
* @param None * @param None
* @retval None * @retval None
* @note None * @note =APB1Clock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler
*******************************************************************************/ *******************************************************************************/
void CAN1_Config(u16 bound) void CAN1_Config(void)
{ {
u8 brp = 3000 / bound;
GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure; CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PORTA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
@ -35,18 +41,20 @@ void CAN1_Config(u16 bound)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); //使能CAN1时钟
//CAN单元设置 //CAN单元设置
CAN_InitStructure.CAN_TTCM = DISABLE; //ENABLE:时间触发通信模式 DISABLE:非时间触发通信模式 CAN_InitStructure.CAN_TTCM = DISABLE; //ENABLE:时间触发通信模式 DISABLE:非时间触发通信模式
CAN_InitStructure.CAN_ABOM = ENABLE; //软件自动离线管理 CAN_InitStructure.CAN_ABOM = ENABLE; //软件自动离线管理
CAN_InitStructure.CAN_AWUM = DISABLE; //ENABLE:监测到can消息退出休眠模式 DISABLE:清除CAN->MCR的SLEEP位退出休眠模式 CAN_InitStructure.CAN_AWUM = DISABLE; //ENABLE:监测到can消息退出休眠模式 DISABLE:清除CAN->MCR的SLEEP位退出休眠模式
CAN_InitStructure.CAN_NART = DISABLE; //ENABLE:无论发送成功与否只一次 DISABLE:发送不成功一直重发 CAN_InitStructure.CAN_NART = DISABLE; //ENABLE:无论发送成功与否只一次 DISABLE:发送不成功一直重发
CAN_InitStructure.CAN_RFLM = DISABLE; //ENABLE:FIFO溢出后丢弃后面的报文 DISABLE:溢出后新的覆盖旧的 CAN_InitStructure.CAN_RFLM = DISABLE; //ENABLE:FIFO溢出后丢弃后面的报文 DISABLE:溢出后新的覆盖旧的
CAN_InitStructure.CAN_TXFP = ENABLE; //ENABLE:优先级由请求顺序决定 DISABLE:优先级由报文标识符决定 CAN_InitStructure.CAN_TXFP = ENABLE; //ENABLE:优先级由请求顺序决定 DISABLE:优先级由报文标识符决定
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //模式设置 CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //模式设置
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; //Tbs1范围CAN_BS1_1tq ~ CAN_BS1_16tq CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; //Tbs1范围CAN_BS1_1tq ~ CAN_BS1_16tq
CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq; //Tbs2范围CAN_BS2_1tq ~ CAN_BS2_8tq CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq; //Tbs2范围CAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler = brp; //分频系数(Fdiv)为brp+1 CAN_InitStructure.CAN_Prescaler = 6; //分频系数(Fdiv)为CAN_Prescaler+1
CAN_Init(CAN1, &CAN_InitStructure); //初始化CAN1 CAN_Init(CAN1, &CAN_InitStructure); //初始化CAN1
//配置过滤器 //配置过滤器
@ -61,79 +69,77 @@ void CAN1_Config(u16 bound)
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; //激活过滤器0 CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; //激活过滤器0
CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化 CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化
// Motor_Cmd(Addr_Left,DISABLE); #ifdef CAN_RX0_INT_ENABLE
// Motor_Cmd(Addr_Right,DISABLE); NVIC_InitTypeDef NVIC_InitStructure;
// delay_ms(20);//CAN命令包发送完成 NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 主优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 次优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); //FIFO0消息挂号中断允许. CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); //FIFO0消息挂号中断允许.
#endif
} }
#ifdef CAN_RX0_INT_ENABLE
/******************************************************************************* /*******************************************************************************
* @brief CAN1中断 * @brief CAN1中断
* @param None * @param None
* @retval None * @retval None
* @note s顺时针n逆时针 S顺时针N逆时针 * @note s顺时针n逆时针 S顺时针N逆时针
*******************************************************************************/ *******************************************************************************/
CanRxMsg BLcanbuf;
FlagStatus BL_Deal_Flag = RESET;
void USB_LP_CAN1_RX0_IRQHandler(void) void USB_LP_CAN1_RX0_IRQHandler(void)
{ {
CanRxMsg RxMessagebuf; CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
CAN_Receive(CAN1, CAN_FIFO0, &RxMessagebuf); if (RxMessage.StdId == 0x7df)
// CanRx_TimeOut_Cnt = 3000; //500ms
if (RxMessagebuf.StdId == 0x7df)
{ {
// if ((RxMessagebuf.Data[0] == 'S') || (RxMessagebuf.Data[0] == 'P') || (RxMessagebuf.Data[0] == 'X') || (RxMessagebuf.Data[0] == 'D')) u16 speed = (RxMessage.Data[6] << 8) | RxMessage.Data[7];
// { motor_set_speed(speed);
// Com_No_T1 = RxMessagebuf.Data[7]; if (motor_info.state != MOTOR_STATE_RUNNING)
// if (Com_No_T1 != Com_No_OLD_T1) {
// { // motor_start();
// if (RecDone_T1 == RESET) }
// RecDone_T1 = SET;
// else
// return;
// memcpy(&uComRx_T1, RxMessagebuf.Data, 8);
// Com_No_OLD_T1 = Com_No_T1;
// }
// else
// {
// if (Say_Hello_T1 == 0)
// Say_Hello_T1 = 1;
// else
// return;
// uComTx_T1.mode = RxMessagebuf.Data[0];
// }
// }
} }
} }
#endif
int CanTx_TimeOut_Cnt = 0; /*******************************************************************************
/********************************************************************** * @brief can发送消息
* Description : None * @param None
* Input : None * @retval None
* Output : None * @note None
* Return : None *******************************************************************************/
* Attention : None u8 can_send_message(u32 id, u8 dlc, u8 *data)
**********************************************************************/
u8 can_send_message(u8 index, u32 id, u8 dlc, u8 *data)
{ {
u8 i;
u8 mbox; u8 mbox;
CanTxMsg TxMessage; u32 timeout = 0xffff;
TxMessage.StdId = id; // 标准标识符 TxMessage.StdId = id; // 标准标识符
TxMessage.ExtId = id; // 设置扩展标示符 TxMessage.ExtId = id; // 设置扩展标示符
TxMessage.IDE = 0; // 标准帧 TxMessage.IDE = 0; // 标准帧
TxMessage.RTR = 0; // 数据帧 TxMessage.RTR = 0; // 数据帧
TxMessage.DLC = dlc; // 要发送的数据长度 TxMessage.DLC = dlc; // 要发送的数据长度
CanTx_TimeOut_Cnt = 50; //25ms for (i = 0; i < dlc; i++)
memcpy(TxMessage.Data, data, 8); {
TxMessage.Data[i] = data[i];
}
do do
{ {
mbox = CAN_Transmit(CAN1, &TxMessage); mbox = CAN_Transmit(CAN1, &TxMessage);
} while ((mbox == CAN_TxStatus_NoMailBox) && (CanTx_TimeOut_Cnt != 0)); timeout--;
} while ((mbox == CAN_TxStatus_NoMailBox) && (timeout > 0));
while ((CAN_TransmitStatus(CAN1, mbox) != CAN_TxStatus_Ok) && (CanTx_TimeOut_Cnt != 0)) while ((CAN_TransmitStatus(CAN1, mbox) != CAN_TxStatus_Ok) && (timeout > 0))
; ;
CanTx_TimeOut_Cnt = 0;
return 1; return 1;
} }
u8 can_receive_message(CanRxMsg *message)
{
if (CAN_MessagePending(CAN1, CAN_FIFO0) == 0)
return 0; //没有接收到数据,直接退出
CAN_Receive(CAN1, CAN_FIFO0, message); //读取数据
return message->DLC;
}
/*********************************END OF FILE**********************************/ /*********************************END OF FILE**********************************/

View File

@ -11,8 +11,9 @@
#include "hall.h" #include "hall.h"
#include "motor.h" #include "motor.h"
/* Definition ----------------------------------------------------------------*/ /* Definition ----------------------------------------------------------------*/
/* Functions -----------------------------------------------------------------*/ u32 hall_last_interval = 0; //记录上次霍尔触发间隔,即电机转动1/6圈所花费的时间
/* Functions -----------------------------------------------------------------*/
/******************************************************************************* /*******************************************************************************
* @brief * @brief
* @param None * @param None
@ -33,7 +34,7 @@ void HALL_Config(void)
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler = 71; TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 1000; TIM_TimeBaseStructure.TIM_Period = 10000;
TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
@ -41,9 +42,9 @@ void HALL_Config(void)
//输入捕获 //输入捕获
TIM_ICInitTypeDef TIM_ICInitStructure; TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //监听T1霍尔事件 TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //监听CH1霍尔事件
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //捕获上升沿 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //捕获上升沿
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC; //选择IC1,IC2IC3通道亦或捕获
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //捕获分频 TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //捕获分频
TIM_ICInitStructure.TIM_ICFilter = 0xF; //输入滤波 TIM_ICInitStructure.TIM_ICFilter = 0xF; //输入滤波
TIM_ICInit(TIM2, &TIM_ICInitStructure); TIM_ICInit(TIM2, &TIM_ICInitStructure);
@ -78,20 +79,28 @@ void HALL_Config(void)
NVIC_Init(&NVIC_InitStructure); NVIC_Init(&NVIC_InitStructure);
} }
/*******************************************************************************
* @brief TIM2定时器中断
* @param None
* @retval None
* @note None
*******************************************************************************/
void TIM2_IRQHandler(void) void TIM2_IRQHandler(void)
{ {
//通道1捕获中断霍尔中断
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{ {
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
motor_info.hall_position = get_hall_position(); motor_info.hall_position = hall_position_detect();
motor_step(); motor_step();
hall_last_interval = TIM2->CCR1; //获取电机实际速度(rps)=(TIM2时钟频率*TIM2->CCR1)/6这里避免中断中复杂计算只缓存了电机转1/6圈的时间
TIM_SetCounter(TIM2, 0);
} }
else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET) else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
{ {
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
//换相
// pwm_Commute(hallpos);
} }
//TODO:此处考虑TIM2溢出中断判断电机堵转
} }
/******************************************************************************* /*******************************************************************************
@ -100,7 +109,7 @@ void TIM2_IRQHandler(void)
* @retval None * @retval None
* @note 4 * @note 4
*******************************************************************************/ *******************************************************************************/
int get_hall_position(void) int hall_position_detect(void)
{ {
return (GPIO_ReadInputData(GPIOA) & 0x0007); return (GPIO_ReadInputData(GPIOA) & 0x0007);
} }

View File

@ -12,10 +12,25 @@
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "stm32f10x_conf.h" #include "stm32f10x_conf.h"
/* Definition ----------------------------------------------------------------*/ /* Definition ----------------------------------------------------------------*/
#define CAN_RX0_INT_ENABLE //使能CAN接收中断
typedef struct
{
u32 id;
u8 dlc;
u8 extend; //0标准帧 1拓展帧
u8 remote; //0数据帧 1远程帧
u8 data[8];
} can_message_t;
/* Exported Functions --------------------------------------------------------*/ /* Exported Functions --------------------------------------------------------*/
void CAN1_Config(u16 bound); // extern can_message_t can_tx_message;
u8 can_send_message(u8 index, u32 id, u8 dlc, u8 *data); // extern can_message_t can_rx_message;
extern CanTxMsg TxMessage;
extern CanRxMsg RxMessage;
void CAN1_Config(void);
u8 can_send_message(u32 id, u8 dlc, u8 *data);
#endif #endif
/*********************************END OF FILE**********************************/ /*********************************END OF FILE**********************************/

View File

@ -14,8 +14,10 @@
/* Definition ----------------------------------------------------------------*/ /* Definition ----------------------------------------------------------------*/
/* Exported Functions --------------------------------------------------------*/ /* Exported Functions --------------------------------------------------------*/
extern u32 hall_last_interval;
void HALL_Config(void); void HALL_Config(void);
int get_hall_position(void); int hall_position_detect(void);
#endif #endif
/*********************************END OF FILE**********************************/ /*********************************END OF FILE**********************************/

View File

@ -14,7 +14,7 @@
/* Definition ----------------------------------------------------------------*/ /* Definition ----------------------------------------------------------------*/
/* Exported Functions --------------------------------------------------------*/ /* Exported Functions --------------------------------------------------------*/
void LED_Config(); void LED_Config(void);
void LED_ON(uint8_t index); void LED_ON(uint8_t index);
void LED_OFF(uint8_t index); void LED_OFF(uint8_t index);

View File

@ -12,6 +12,8 @@
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "stm32f10x_conf.h" #include "stm32f10x_conf.h"
/* Definition ----------------------------------------------------------------*/ /* Definition ----------------------------------------------------------------*/
#define MOTOR_TRANSMITTING_RATIO 58
enum motor_mode enum motor_mode
{ {
MOTOR_MODE_SPEED, //速度模式 MOTOR_MODE_SPEED, //速度模式
@ -27,7 +29,9 @@ enum motor_dir
enum motor_state enum motor_state
{ {
MOTOR_STATE_STOP //停止状态 MOTOR_STATE_STOP, //停止状态
MOTOR_STATE_RUNNING, //运行状态
MOTOR_STATE_ERROR, //故障状态
}; };
typedef struct _motor typedef struct _motor
@ -36,8 +40,8 @@ typedef struct _motor
u8 dir; u8 dir;
u8 state; //运行状态 u8 state; //运行状态
u8 hall_position; //霍尔位置 u8 hall_position; //霍尔位置
s16 speed; //转速 float speed; //转速(r/min)
u32 step; s32 step;
} motor_t; } motor_t;

View File

@ -18,7 +18,7 @@
* @retval None * @retval None
* @note None * @note None
*******************************************************************************/ *******************************************************************************/
void LED_Config() void LED_Config(void)
{ {
GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
@ -39,12 +39,12 @@ void LED_ON(uint8_t index)
{ {
if (index == 0) if (index == 0)
{ {
GPIO_WriteBit(GPIOB, GPIO_Pin_5, SET); GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET);
} }
if (index == 1) if (index == 1)
{ {
GPIO_WriteBit(GPIOB, GPIO_Pin_6, SET); GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_SET);
} }
} }
@ -58,12 +58,12 @@ void LED_OFF(uint8_t index)
{ {
if (index == 0) if (index == 0)
{ {
GPIO_WriteBit(GPIOB, GPIO_Pin_5, RESET); GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET);
} }
if (index == 1) if (index == 1)
{ {
GPIO_WriteBit(GPIOB, GPIO_Pin_6, RESET); GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_RESET);
} }
} }
/*********************************END OF FILE**********************************/ /*********************************END OF FILE**********************************/

View File

@ -9,9 +9,21 @@
*******************************************************************************/ *******************************************************************************/
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "motor.h" #include "motor.h"
#include "hall.h"
/* Definition ----------------------------------------------------------------*/ /* Definition ----------------------------------------------------------------*/
motor_t motor_info; motor_t motor_info;
/* Functions -----------------------------------------------------------------*/ /* Functions -----------------------------------------------------------------*/
/*******************************************************************************
* @brief MOS管输出
* @param None
* @retval None
* @note None
*******************************************************************************/
void motor_mos_enable(FunctionalState state)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_12, state); //关闭MOS输出
}
/******************************************************************************* /*******************************************************************************
* @brief * @brief
* @param None * @param None
@ -25,8 +37,7 @@ void motor_init(void)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_WriteBit(GPIOB, GPIO_Pin_12, RESET); //关闭MOS输出
motor_info.dir = MOTOR_DIR_CCW;
} }
/******************************************************************************* /*******************************************************************************
@ -37,10 +48,10 @@ void motor_init(void)
*******************************************************************************/ *******************************************************************************/
void motor_start(void) void motor_start(void)
{ {
motor_info.state = 1; motor_info.state = MOTOR_STATE_RUNNING;
GPIO_WriteBit(GPIOB, GPIO_Pin_12, SET); motor_mos_enable(ENABLE);
//TODO:开启霍尔捕捉中断 //TODO:开启霍尔捕捉中断
motor_info.hall_position = get_hall_position(); motor_info.hall_position = hall_position_detect();
motor_step(); motor_step();
} }
@ -53,6 +64,8 @@ void motor_start(void)
void motor_stop(void) void motor_stop(void)
{ {
motor_info.state = MOTOR_STATE_STOP; motor_info.state = MOTOR_STATE_STOP;
hall_last_interval = 0;
motor_mos_enable(DISABLE);
TIM1->CCR1 = 0; TIM1->CCR1 = 0;
TIM1->CCR2 = 0; TIM1->CCR2 = 0;
TIM1->CCR3 = 0; TIM1->CCR3 = 0;
@ -140,8 +153,9 @@ void motor_step(void)
break; break;
default: default:
motor_stop(); motor_stop();
break; return;
} }
motor_info.dir == MOTOR_DIR_CCW ? motor_info.step-- : motor_info.step++;
TIM_GenerateEvent(TIM1, TIM_EventSource_COM); TIM_GenerateEvent(TIM1, TIM_EventSource_COM);
} }
@ -153,9 +167,16 @@ void motor_step(void)
*******************************************************************************/ *******************************************************************************/
void motor_set_speed(s16 speed) void motor_set_speed(s16 speed)
{ {
if (speed == 0)
{
motor_stop();
return;
}
TIM1->CCR1 = speed; TIM1->CCR1 = speed;
TIM1->CCR2 = speed; TIM1->CCR2 = speed;
TIM1->CCR3 = speed; TIM1->CCR3 = speed;
motor_start();
} }
/*********************************END OF FILE**********************************/ /*********************************END OF FILE**********************************/

View File

@ -39,16 +39,9 @@ void PWM_Config(void)
GPIO_ResetBits(GPIOB, GPIO_Pin_13); GPIO_ResetBits(GPIOB, GPIO_Pin_13);
GPIO_ResetBits(GPIOB, GPIO_Pin_14); GPIO_ResetBits(GPIOB, GPIO_Pin_14);
GPIO_ResetBits(GPIOB, GPIO_Pin_15); GPIO_ResetBits(GPIOB, GPIO_Pin_15);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO_SetBits(GPIOB, GPIO_Pin_12);
//PWM频率:12k
TIM_DeInit(TIM1); TIM_DeInit(TIM1);
//PWM频率:12k
TIM_TimeBaseStructure.TIM_Prescaler = 1; //2分频 TIM_TimeBaseStructure.TIM_Prescaler = 1; //2分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned2; //中央对齐计数模式,输出比较标志位只有在比较器向上计算被设置 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned2; //中央对齐计数模式,输出比较标志位只有在比较器向上计算被设置
TIM_TimeBaseStructure.TIM_Period = 1500 - 1; //PWM频率计算:72000000/TIM_Period+1/TIM_Prescaler+1,如果是中央对齐计数模式再除以2 TIM_TimeBaseStructure.TIM_Period = 1500 - 1; //PWM频率计算:72000000/TIM_Period+1/TIM_Prescaler+1,如果是中央对齐计数模式再除以2
@ -56,13 +49,13 @@ void PWM_Config(void)
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_ForcedAction_InActive; //PWM2:递增计数时CNT<CCRx,OC输出无效电平;递减计数时CNT>CCRx,OC输出有效电平 TIM_ForcedAction_InActive TIM_OCInitStructure.TIM_OCMode = TIM_ForcedAction_InActive; //默认初始化为无效电平
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_Pulse = 0; //默认占空比0
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //起始波形为高电平
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //TIM_OCIdleState_Set;TIM_OCIdleState_Reset TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //空闲状态下输出低电平仅TIM1,TIM8有效
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC2Init(TIM1, &TIM_OCInitStructure); TIM_OC2Init(TIM1, &TIM_OCInitStructure);
@ -79,7 +72,7 @@ void PWM_Config(void)
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1; TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
TIM_BDTRInitStructure.TIM_DeadTime = 100; TIM_BDTRInitStructure.TIM_DeadTime = 100;
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; //如打开,开机无输出且状态紊乱???? TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low; TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable; TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure); TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
@ -89,18 +82,12 @@ void PWM_Config(void)
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能捕获比较寄存器预装载通道3 TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能捕获比较寄存器预装载通道3
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能捕获比较寄存器预装载通道4 TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能捕获比较寄存器预装载通道4
TIM_SelectInputTrigger(TIM1, TIM_TS_ITR1); //输入触发源选择内部触发3:ITR3(TIM1->TIM4,TIM8->TIM5) TIM_SelectInputTrigger(TIM1, TIM_TS_ITR1); //输入触发源选择内部触发
TIM_CCPreloadControl(TIM1, ENABLE); //CCER预装载 TIM_CCPreloadControl(TIM1, ENABLE); //CCER预装载
TIM_SelectCOM(TIM1, ENABLE); //软件触发和TRGI触发更新 TIM_SelectCOM(TIM1, ENABLE); //软件触发和TRGI触发更新
TIM_CtrlPWMOutputs(TIM1, ENABLE); //使能PWM输出
TIM_CtrlPWMOutputs(TIM1, ENABLE);
TIM_ClearITPendingBit(TIM1, TIM_IT_COM); TIM_ClearITPendingBit(TIM1, TIM_IT_COM);
TIM_ITConfig(TIM1, TIM_IT_COM, ENABLE); //开启COM中断,意图:6路互补PWM设置被更改后不是立即生效,需要等待其它关联定时器触发更改,或者通过COM中断来立即执行更改 TIM_ITConfig(TIM1, TIM_IT_COM, ENABLE); //开启COM中断,意图:6路互补PWM设置被更改后不是立即生效,需要等待其它关联定时器触发更改,或者通过COM中断来立即执行更改
TIM_Cmd(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE);
} }

View File

@ -15,6 +15,7 @@
#include "led.h" #include "led.h"
#include "hall.h" #include "hall.h"
#include "pwm.h" #include "pwm.h"
#include "can.h"
#include "motor.h" #include "motor.h"
/* Definition ----------------------------------------------------------------*/ /* Definition ----------------------------------------------------------------*/

View File

@ -34,7 +34,6 @@ void RCC_Config()
*******************************************************************************/ *******************************************************************************/
void test(void) void test(void)
{ {
motor_init();
motor_start(); motor_start();
delay_ms(5000); delay_ms(5000);
motor_set_speed(100); motor_set_speed(100);
@ -84,16 +83,23 @@ int main(void)
NVIC_Config(); NVIC_Config();
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //关闭jtag保留swd。 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //关闭jtag保留swd。
SysTick_init(); SysTick_init();
LED_Config();
HALL_Config(); HALL_Config();
PWM_Config(); PWM_Config();
CAN1_Config(); CAN1_Config();
test(); motor_init();
// test();
while (1) while (1)
{ {
LED_ON(1);
delay_ms(500);
LED_OFF(1);
delay_ms(500); delay_ms(500);
TxMessage.StdId = 0x111;
TxMessage.DLC = 8;
TxMessage.Data[0] = motor_info.state;
motor_info.speed = 1000000.0f * 60 / (hall_last_interval * 6 * MOTOR_TRANSMITTING_RATIO);
TxMessage.Data[6] = (u32)motor_info.speed >> 8;
TxMessage.Data[7] = (u32)motor_info.speed;
CAN_Transmit(CAN1, &TxMessage);
} }
} }