新手上路
- 积分
- 38
- 金钱
- 38
- 注册时间
- 2019-3-23
- 在线时间
- 11 小时
|
1金钱
#include "CAN.h"
#include "delay.h"
#include "usart.h"
#include "lcd.h"
u8 CAN_Mode_Init(u8 sjw,u8 bs2,u8 bs1,u16 brp,u8 mode)
{ GPIO_InitTypeDef GPIO_InitStruct;
CAN_InitTypeDef CAN_InitStruct;
CAN_FilterInitTypeDef CAN_FilterInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1,ENABLE);//PINA 时钟
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,ENABLE);// CAN 时钟
// GPIO 设置
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU; //上拉输入
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;// 复用推挽
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
CAN_DeInit(CAN1);
// CAN 设置
CAN_InitStruct.CAN_TTCM=DISABLE; //非时间触发
CAN_InitStruct.CAN_ABOM=DISABLE; //软件自动离线管理
CAN_InitStruct.CAN_AWUM=DISABLE; //睡眠模式通过软件唤醒
CAN_InitStruct.CAN_NART=ENABLE; //发送失败时候,一直发送直至成功
CAN_InitStruct.CAN_RFLM=DISABLE; //接收报文未被读出时,下一个报文会覆盖原来的报文
CAN_InitStruct.CAN_TXFP=DISABLE; //发送由id决定
CAN_InitStruct.CAN_Mode=mode; //CAN 模式为正常模式
CAN_InitStruct.CAN_SJW=sjw;
CAN_InitStruct.CAN_BS1=bs1;
CAN_InitStruct.CAN_BS2=bs2;
CAN_InitStruct.CAN_Prescaler=brp;
CAN_Init(CAN1, &CAN_InitStruct);
// CAN 滤波器0
CAN_FilterInitStruct.CAN_FilterNumber=0; //滤波器0
CAN_FilterInitStruct.CAN_FilterMode=CAN_FilterMode_IdMask; //指定iD
CAN_FilterInitStruct.CAN_FilterScale=CAN_FilterScale_32bit;//32位 扩展id
CAN_FilterInitStruct.CAN_FilterIdHigh=0x08C1;
CAN_FilterInitStruct.CAN_FilterIdLow=0xEF21; // 转速 转矩 档位 id
CAN_FilterInitStruct.CAN_FilterMaskIdHigh=0xFFFF;
CAN_FilterInitStruct.CAN_FilterMaskIdLow=0xFFFF; // id必须一致
CAN_FilterInitStruct.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //关系到fifo0
CAN_FilterInitStruct.CAN_FilterActivation=ENABLE; //使能滤波器0
CAN_FilterInit(&CAN_FilterInitStruct);
//CAN 滤波器1
CAN_FilterInitStruct.CAN_FilterNumber=1; //滤波器1
CAN_FilterInitStruct.CAN_FilterMode=CAN_FilterMode_IdMask; //指定iD
CAN_FilterInitStruct.CAN_FilterScale=CAN_FilterScale_32bit;//32位 扩展id
CAN_FilterInitStruct.CAN_FilterIdHigh=0x0CFF;
CAN_FilterInitStruct.CAN_FilterIdLow=0xC7EF; // 控制器温度 电机温度 id
CAN_FilterInitStruct.CAN_FilterMaskIdHigh=0xFFFF;
CAN_FilterInitStruct.CAN_FilterMaskIdLow=0xFFFF; // id必须一致
CAN_FilterInitStruct.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //关系到fifo0
CAN_FilterInitStruct.CAN_FilterActivation=ENABLE; //使能滤波器0
CAN_FilterInit(&CAN_FilterInitStruct);
//CAN 滤波器2
CAN_FilterInitStruct.CAN_FilterNumber=2; //滤波器2
CAN_FilterInitStruct.CAN_FilterMode=CAN_FilterMode_IdMask; //指定iD
CAN_FilterInitStruct.CAN_FilterScale=CAN_FilterScale_32bit;//32位 扩展id
CAN_FilterInitStruct.CAN_FilterIdHigh=0x1860;
CAN_FilterInitStruct.CAN_FilterIdLow=0x40F3; // 电池总电压 SOC 电流 id
CAN_FilterInitStruct.CAN_FilterMaskIdHigh=0xFFFF;
CAN_FilterInitStruct.CAN_FilterMaskIdLow=0xFFFF; // id必须一致
CAN_FilterInitStruct.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //关系到fifo0
CAN_FilterInitStruct.CAN_FilterActivation=ENABLE; //使能滤波器0
CAN_FilterInit(&CAN_FilterInitStruct);
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority =0;
NVIC_InitStruct.NVIC_IRQChannelCmd =ENABLE;
NVIC_Init(&NVIC_InitStruct);
return 0;
}
//中断服务函数
void USB_LP_CAN1_RX0_IRQHandler(void)
{ CanRxMsg RxMessage;
int MOTOR_SPEED;
int MOTOR_TORQUE;
int BAT_SOC;
int BAT_VOL;
int BAT_CUR;
int MOTOR_TEMP;
int MCU_TEMP;
CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);
if(RxMessage.ExtId==0x08C1EF21)
{ MOTOR_SPEED=1000; //转速
MOTOR_TORQUE=((u16)(RxMessage.Data[3]<<8)|RxMessage.Data[2])*0.01; //转矩
LCD_ShowxNum(156,220,MOTOR_SPEED,4,16,0X80);
LCD_ShowxNum(164,260,MOTOR_TORQUE,4,16,0X80);
}
else if(RxMessage.ExtId==0x0CFFC7EF)
{ MOTOR_TEMP=RxMessage.Data[0]-50; //电机温度
MCU_TEMP=RxMessage.Data[1]-50; //控制器温度
LCD_ShowxNum(148,300,MOTOR_TEMP,4,16,0X80);
LCD_ShowxNum(132,340,MCU_TEMP,3,16,0X80);
}
else if(RxMessage.ExtId==0x186040F3)
{ BAT_VOL=((u16)(RxMessage.Data[0]<<8)|RxMessage.Data[1])*0.1; //电池电压
BAT_CUR=(((u16)(RxMessage.Data[2]<<8)|RxMessage.Data[3])*0.1)-1000; //电池电流
BAT_SOC=RxMessage.Data[4]; // 电池容量
LCD_ShowxNum(124,400,BAT_VOL,3,16,0X80);
LCD_ShowxNum(124,110,BAT_CUR,3,16,0X80);
LCD_ShowxNum(124,70,BAT_SOC,3,16,0X80);
}
CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);
}
#include "led.h"
#include "lcd.h"
#include "can.h"
#include "usart.h"
#include "delay.h"
#include "sys.h"
#include "adc.h"
#include "key.h"
extern void Adc_init(void);
extern u16 get_imd_adc(u8 ch);
extern u16 get_bms_adc(u8 ch);
int main(void)
{
int imd_adc;
int bms_adc;
int imd_zs;
int bms_zs;
float imd_vol;
float bms_vol;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
uart_init(115200);
LED_Init();
LCD_Init();
Adc_init();
KEY_Init();
CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,8,CAN_Mode_Normal); //设置波特率 250kbps 36000/(7+8+1)*9=250kbps
LCD_Display_Dir(1);
POINT_COLOR=RED;
LCD_ShowString(60,70,400,16,16,"BAT_SOC=000%");
LCD_ShowString(60,110,400,16,16,"BAT_CUR=0000A");
LCD_ShowString(60,140,400,16,16,"IMD_VOL=00.000V");
LCD_ShowString(60,180,400,16,16,"BMS_VOL=00.000V");
LCD_ShowString(60,220,400,16,16,"MOTOR_SPEED=0000r/min");
LCD_ShowString(60,260,400,16,16,"MOTOR_TORQUE=0000%");
LCD_ShowString(60,300,400,16,16,"MOTOR_TEMP=000℃");
LCD_ShowString(60,340,400,16,16,"MCU_TEMP=000℃");
LCD_ShowString(60,380,400,16,16,"BAT_VOL=000V");
while(1)
{
// imd电压
imd_adc=get_imd_adc(ADC_Channel_6);
imd_vol=imd_adc*(3.3/4096)*4;
imd_zs=imd_vol;
LCD_ShowxNum(124,140,imd_zs,2,16,0X80);
imd_vol-=imd_zs;
imd_vol*=1000;
LCD_ShowxNum(148,140,imd_vol,3,16,0X80);
//bms电压
bms_adc=get_bms_adc(ADC_Channel_7);
bms_vol=bms_adc*(3.3/4096)*4;
bms_zs=bms_vol;
LCD_ShowxNum(124,180,bms_zs,2,16,0X80);
bms_vol-=bms_zs;
bms_vol*=1000;
LCD_ShowxNum(148,180,bms_vol,3,16,0X80);
}
上面can配置的函数和can接收中断服务函数
目前不知道怎么解决 ,有大佬吗
|
|