完成上报速度
This commit is contained in:
parent
7e8ee6641d
commit
f08e44509c
@ -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>
|
||||||
|
@ -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;
|
||||||
|
@ -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**********************************/
|
||||||
|
@ -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,IC2,IC3通道亦或捕获
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
@ -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**********************************/
|
||||||
|
@ -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**********************************/
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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**********************************/
|
||||||
|
@ -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**********************************/
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 ----------------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user