飞控代码.docx
- 文档编号:24642396
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:93
- 大小:38.86KB
飞控代码.docx
《飞控代码.docx》由会员分享,可在线阅读,更多相关《飞控代码.docx(93页珍藏版)》请在冰豆网上搜索。
飞控代码
TIM_PWM_IN.c
#include"TIM_PWM_IN.h"
T_RC_DATARc_Data;//1000~2000
voidTIM4_Cap_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_ICInitTypeDefTIM4_ICInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//使能GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO功能的时钟
GPIO_PinRemapConfig(GPIO_Remap_TIM4,ENABLE);//进行重映射
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_ResetBits(GPIOD,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
//初始化定时器4TIM4
TIM_TimeBaseStructure.TIM_Period=0XFFFF;//设定计数器自动重装值
TIM_TimeBaseStructure.TIM_Prescaler=71;//预分频器
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//设置时钟分割:
TDTS=Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM4输入捕获参数
TIM4_ICInitStructure.TIM_Channel=TIM_Channel_1;//CC1S=01选择输入端IC1映射到TI1上
TIM4_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//上升沿捕获
TIM4_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//映射到TI1上
TIM4_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;//配置输入分频,不分频
TIM4_ICInitStructure.TIM_ICFilter=0x00;//IC1F=0000配置输入滤波器不滤波
TIM_ICInit(TIM4,&TIM4_ICInitStructure);
TIM4_ICInitStructure.TIM_Channel=TIM_Channel_2;//CC1S=01选择输入端IC1映射到TI1上
TIM4_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//上升沿捕获
TIM4_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//映射到TI1上
TIM4_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;//配置输入分频,不分频
TIM4_ICInitStructure.TIM_ICFilter=0x00;//IC1F=0000配置输入滤波器不滤波
TIM_ICInit(TIM4,&TIM4_ICInitStructure);
TIM4_ICInitStructure.TIM_Channel=TIM_Channel_3;//CC1S=01选择输入端IC1映射到TI1上
TIM4_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//上升沿捕获
TIM4_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//映射到TI1上
TIM4_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;//配置输入分频,不分频
TIM4_ICInitStructure.TIM_ICFilter=0x00;//IC1F=0000配置输入滤波器不滤波
TIM_ICInit(TIM4,&TIM4_ICInitStructure);
TIM4_ICInitStructure.TIM_Channel=TIM_Channel_4;//CC1S=01选择输入端IC1映射到TI1上
TIM4_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//上升沿捕获
TIM4_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//映射到TI1上
TIM4_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;//配置输入分频,不分频
TIM4_ICInitStructure.TIM_ICFilter=0x00;//IC1F=0000配置输入滤波器不滤波
TIM_ICInit(TIM4,&TIM4_ICInitStructure);
TIM_Cmd(TIM4,ENABLE);
TIM_ITConfig(TIM4,TIM_IT_CC1,ENABLE);//允许更新中断,允许CC1IE捕获中断
TIM_ITConfig(TIM4,TIM_IT_CC2,ENABLE);
TIM_ITConfig(TIM4,TIM_IT_CC3,ENABLE);
TIM_ITConfig(TIM4,TIM_IT_CC4,ENABLE);
}
u8TIM4CH1_CAPTURE_STA=0;//输入捕获状态
u16TIM4CH1_CAPTURE_VAL;//输入捕获值
u8TIM4CH2_CAPTURE_STA=0;//输入捕获状态
u16TIM4CH2_CAPTURE_VAL;//输入捕获值
u8TIM4CH3_CAPTURE_STA=0;//输入捕获状态
u16TIM4CH3_CAPTURE_VAL;//输入捕获值
u8TIM4CH4_CAPTURE_STA=0;//输入捕获状态
u16TIM4CH4_CAPTURE_VAL;//输入捕获值
//定时器4中断服务程序
voidTIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_CC1)!
=RESET)//捕获1发生捕获事件
{
TIM_ClearITPendingBit(TIM4,TIM_IT_CC1);//清除中断标志位
if(TIM4CH1_CAPTURE_STA&0X40)//捕获到一个下降沿
{
TIM4CH1_CAPTURE_STA|=0X80;//标记成功捕获到一次上升沿
TIM4CH1_CAPTURE_VAL=TIM_GetCapture1(TIM4);
TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Rising);//CC1P=0设置为上升沿捕获
}
else//还未开始,第一次捕获上升沿
{
TIM4CH1_CAPTURE_STA=0;//清空
TIM4CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM4,0);
TIM4CH1_CAPTURE_STA|=0X40;//标记捕获到了上升沿
TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Falling);//CC1P=1设置为下降沿捕获
}
}
if(TIM_GetITStatus(TIM4,TIM_IT_CC2)!
=RESET)//捕获1发生捕获事件
{
TIM_ClearITPendingBit(TIM4,TIM_IT_CC2);//清除中断标志位
if(TIM4CH2_CAPTURE_STA&0X40)//捕获到一个下降沿
{
TIM4CH2_CAPTURE_STA|=0X80;//标记成功捕获到一次上升沿
TIM4CH2_CAPTURE_VAL=TIM_GetCapture2(TIM4);
TIM_OC2PolarityConfig(TIM4,TIM_ICPolarity_Rising);//CC1P=0设置为上升沿捕获
}
else//还未开始,第一次捕获上升沿
{
TIM4CH2_CAPTURE_STA=0;//清空
TIM4CH2_CAPTURE_VAL=0;
TIM_SetCounter(TIM4,0);
TIM4CH2_CAPTURE_STA|=0X40;//标记捕获到了上升沿
TIM_OC2PolarityConfig(TIM4,TIM_ICPolarity_Falling);//CC1P=1设置为下降沿捕获
}
}
if(TIM_GetITStatus(TIM4,TIM_IT_CC3)!
=RESET)//捕获1发生捕获事件
{
TIM_ClearITPendingBit(TIM4,TIM_IT_CC3);//清除中断标志位
if(TIM4CH3_CAPTURE_STA&0X40)//捕获到一个下降沿
{
TIM4CH3_CAPTURE_STA|=0X80;//标记成功捕获到一次上升沿
TIM4CH3_CAPTURE_VAL=TIM_GetCapture3(TIM4);
TIM_OC3PolarityConfig(TIM4,TIM_ICPolarity_Rising);//CC1P=0设置为上升沿捕获
}
else//还未开始,第一次捕获上升沿
{
TIM4CH3_CAPTURE_STA=0;//清空
TIM4CH3_CAPTURE_VAL=0;
TIM_SetCounter(TIM4,0);
TIM4CH3_CAPTURE_STA|=0X40;//标记捕获到了上升沿
TIM_OC3PolarityConfig(TIM4,TIM_ICPolarity_Falling);//CC1P=1设置为下降沿捕获
}
}
if(TIM_GetITStatus(TIM4,TIM_IT_CC4)!
=RESET)//捕获1发生捕获事件
{
TIM_ClearITPendingBit(TIM4,TIM_IT_CC4);//清除中断标志位
if(TIM4CH4_CAPTURE_STA&0X40)//捕获到一个下降沿
{
TIM4CH4_CAPTURE_STA|=0X80;//标记成功捕获到一次上升沿
TIM4CH4_CAPTURE_VAL=TIM_GetCapture4(TIM4);
TIM_OC4PolarityConfig(TIM4,TIM_ICPolarity_Rising);//CC1P=0设置为上升沿捕获
}else//还未开始,第一次捕获上升沿
{
TIM4CH4_CAPTURE_STA=0;//清空
TIM4CH4_CAPTURE_VAL=0;
TIM_SetCounter(TIM4,0);
TIM4CH4_CAPTURE_STA|=0X40;//标记捕获到了上升沿
TIM_OC4PolarityConfig(TIM4,TIM_ICPolarity_Falling);//CC1P=1设置为下降沿捕获
}
}
}
//获取4路PWM值
voidGET_FOUR_PWM(void)
{
if(TIM4CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿
{
Rc_Data.YAW=TIM4CH1_CAPTURE_VAL;//得到总的高电平时
TIM4CH1_CAPTURE_STA=0;//开启下一次捕获
}
if(TIM4CH2_CAPTURE_STA&0X80)//成功捕获到了一次上升沿
{
Rc_Data.THROTTLE=TIM4CH2_CAPTURE_VAL;//得到总的高电平时
TIM4CH2_CAPTURE_STA=0;//开启下一次捕获
}
if(TIM4CH3_CAPTURE_STA&0X80)//成功捕获到了一次上升沿
{
Rc_Data.PITCH=TIM4CH3_CAPTURE_VAL;//得到总的高电平时
TIM4CH3_CAPTURE_STA=0;//开启下一次捕获
}
if(TIM4CH4_CAPTURE_STA&0X80)//成功捕获到了一次上升沿
{
Rc_Data.ROLL=TIM4CH4_CAPTURE_VAL;//得到总的高电平时
TIM4CH4_CAPTURE_STA=0;//开启下一次捕获
}
}
TIM_PWM_IN.h
#ifndef__TIM_PWM_IN_H_
#define__TIM_PWM_IN_H_
#include"stm32f10x.h"
typedefstructint16_rcget{
int16_tROLL;
int16_tPITCH;
int16_tTHROTTLE;
int16_tYAW;
int16_tpitch_offset;
int16_troll_offset;
int16_tyaw_offset;}T_RC_DATA;
externT_RC_DATARc_Data;//1000~2000
voidTIM4_Cap_Init(void);
voidGET_FOUR_PWM(void);
#endif
Time.c
#include"time.h"
#include"stm32f10x.h"
/**************************实现函数********************************************
*函数原型:
*功 能:
1ms中断一次,计数器为1000
*******************************************************************************/
voidTIM3_Init(u16period_num)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
//基础设置,时基和比较输出设置,由于这里只需定时,所以不用OC比较输出
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_DeInit(TIM3);
TIM_TimeBaseStructure.TIM_Period=period_num;//装载值
//prescaleris1200,thatis72000000/72/500=2000Hz;
TIM_TimeBaseStructure.TIM_Prescaler=72-1;//分频系数
//setclockdivision
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//orTIM_CKD_DIV2orTIM_CKD_DIV4
//countup
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
//cleartheTIM3overflowinterruptflag
TIM_ClearFlag(TIM3,TIM_FLAG_Update);
//TIM3overflowinterruptenable
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
//enableTIM3
TIM_Cmd(TIM3,DISABLE);
}
voidNvic_Init(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
/*NVIC_PriorityGroup*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;//TIM4中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//先占优先级1级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//从优先级0级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
/*EnabletheUSARTyInterrupt*/
NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
Time.h
#ifndef__TIME_H__
#define__TIME_H__
#include"stm32f10x.h"
#defineEnTIM3()TIM_Cmd(TIM3,ENABLE)
voidNvic_Init(void);
voidTIM3_Init(u16period_num);
#endif
Motor
#include"moto.h"
voidTim2_init(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_OCInitTypeDefTIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
/**********************************************************
72000000/72=1M
1000000/2500=400Hz
所以产生的PWM为400Hz
周期为2.5ms,对应2500的计算值,1ms~2ms对应的计算值为1000~2000;
**********************************************************/
TIM_TimeBaseStructure.TIM_Period=2499;//计数上线
TIM_TimeBaseStructure.TIM_Prescaler=71;//pwm时钟分频
TIM_TimeBaseStructure.TIM_ClockDivision=0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInit(TIM8,&TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructur
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 代码