/***********************************************************
函数名称:TIM5_PWM_Init(u16 arr,u16 psc)
函数功能:
入口参数:arr:自动重装值;psc:时钟预分频数
出口参数:
备 注: TIM5输出引脚:没有重映射:TIM5_CH1_ETR-PA0;TIM5_CH2-PA1;TIM5_CH3-PA2;TIM5_CH3-PA3;
重映射:查看引脚重映射配置
***********************************************************/
void TIM5_PWM_Init(u16 arr,u16 psc)
{
/*--------------------------*/
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/*--------------------------*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //时钟TIM5使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能AFIO复用功能模块时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIO时钟
/*--------------------------*/
//GPIO初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0+GPIO_Pin_1+GPIO_Pin_2+GPIO_Pin_3; //TIM5_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO
/*--------------------------*/
//初始化TIM5
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
/*--------------------------*/
//初始化TIM5 Channel2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
TIM_OC1Init(TIM5, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM5 OC2
TIM_OC2Init(TIM5, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM5 OC2
TIM_OC3Init(TIM5, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM5 OC2
TIM_OC4Init(TIM5, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM5 OC2
/*--------------------------*/
TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIM5在CCR2上的预装载寄存器
TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIM5在CCR2上的预装载寄存器
TIM_OC3PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIM5在CCR2上的预装载寄存器
TIM_OC4PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIM5在CCR2上的预装载寄存器
/*--------------------------*/
TIM_Cmd(TIM5, ENABLE); //使能TIM3
}
/******************************************************************************/
/******************************************************************************/
int main(void)
{
/*********************************************************************************/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(500000); //串口初始化为500000
delay_init(); //延时初始化
usmart_dev.init(72); //初始化USMART
LED_Init(); //初始化与LED连接的硬件接口
// Remote_Init();
LCD_Init(); //初始化LCD
MPU_Init(); //初始化MPU6050
// TIM1_Config(10000-1,71); /* TIM1 10ms Inturrupt */
// TIM5_Int_Init(2500-1,71);/* TIM5 5ms Inturrupt 采样率200Hz 不能更改*/
// TIM3_PWM_Init(999,24);
TIM5_PWM_Init(999,24);
/***********************************************************************************/
POINT_COLOR=RED; //设置字体为红色
basic_printf();
POINT_COLOR=BLUE;
LCD_ShowString(30,390,200,16,16,"Pitch: . C");
LCD_ShowString(30,420,200,16,16," Roll: . C");
LCD_ShowString(30,450,200,16,16," Yaw : . C");
while(mpu_dmp_init())
{
// LED1=0;
LCD_ShowString(250,450,200,16,16,"no");
}
// LED1=1;
LCD_ShowString(250,450,200,16,16,"yes");
///***********************************************************************************/
while(1)
{
Remote_Scan();
POINT_COLOR=BLUE;
if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
{
MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度传感器数据
MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺仪数据
mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定义帧发送加速度和陀螺仪原始数据
usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
if((t%10)==0)
{
temp=pitch*10;
if(temp<0)
{
LCD_ShowChar(30+48,390,'-',16,0); //显示负号
temp=-temp; //转为正数
}else LCD_ShowChar(30+48,390,' ',16,0); //去掉负号
LCD_ShowNum(30+48+8,390,temp/10,3,16); //显示整数部分
LCD_ShowNum(30+48+40,390,temp%10,1,16); //显示小数部分
temp=roll*10;
if(temp<0)
{
LCD_ShowChar(30+48,420,'-',16,0); //显示负号
temp=-temp; //转为正数
}else LCD_ShowChar(30+48,420,' ',16,0); //去掉负号
LCD_ShowNum(30+48+8,420,temp/10,3,16); //显示整数部分
LCD_ShowNum(30+48+40,420,temp%10,1,16); //显示小数部分
temp=yaw*10;
if(temp<0)
{
LCD_ShowChar(30+48,450,'-',16,0); //显示负号
temp=-temp; //转为正数
}else LCD_ShowChar(30+48,450,' ',16,0); //去掉负号
LCD_ShowNum(30+48+8,450,temp/10,3,16); //显示整数部分
LCD_ShowNum(30+48+40,450,temp%10,1,16); //显示小数部分
t=0;
}
}
t++;
}
|