《【飞控开发基础教程9】开源编队无人机-PWM(电机控制).docx》由会员分享,可在线阅读,更多相关《【飞控开发基础教程9】开源编队无人机-PWM(电机控制).docx(10页珍藏版)》请在第一文库网上搜索。
1、COCOFLY教程疯壳无人机系列目录一、PWM 简介1二、占空比简介1三、STM32的PWM模式2四、寄存器2五、PWM电机控制实验3Al开源编队无人机Al OPEN SOURCE FORMATION DRONER t Hi.语音控制视觉追踪编队飞行高级功能激光气压双青定赛光流定点有头无头双模式3D翻浪WIFlSf*控制遥控控制飞行视觉追踪图码视觉追踪II色视觉追踪形状视觉跟随移动小车图形化多机编队飞行支椅图形化遍程自主巡线飞行AI语音控能资料地址:http:www. fengke. club7PWM (电机控制)一、PWM简介脉冲宽度调制(PWM),是英文“Pulse Width Modul
2、ation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。PWM在生活中非常的常见,小到呼吸灯的闪烁,达到航天飞船都会应用到PWM技术。PWM的波形如下图所示。11| t2T二、 占空比简介占空比是脉冲宽度调制技术中常用专业术语,占空比是指在一个时钟脉冲周期(T)内,高电平(tl)的时间占总周期时间的比值,即占空比(duty)=tI*100%如下图所示是一系列典型的脉冲波形。 4ms 6ms 6ms i 4ms i 8ms 12msiiiiii i第一个PWM波,周期为10ms,高电平的时间为4ms,
3、所以占空比为40%,同理第二个PWM波为60%,第三个为80% o一般地,占空比反映了等效幅值的大小:占空比越大,等效幅值越高;占空比越小,等效幅值越低。如下图所示为不同占空比对应等效幅值的关系示意图。Pulse Width Modulation (PWM)三、STM32的PWM模式STM32上定时器有专门的PWM模式,它的原理是通过定时器使用比较输出的方式如下图所示产生波形。ARR为自动重载寄存器,CCR为捕获/比较寄存器,CNT就是定时器的计数器,CNT的值从。开始递增,使用PWM模式后,可以设置有效电平,以及PWM的模式。上图所示的是当CNT的值小于CCRx时,输出低电平,当CNT的值大
4、于CCRx时,输出高点平,所以我们可以通过改变ARR的值来改变PWM的周期,改变CCRx的值来改变PWM的占空比,从而实现任意频率任意占空比的PWM 波。四、寄存器STM32的PWM输出模式涉及到以下寄存器。(1) TIMx_CRl:定时器控制寄存器1,如下图所示。1514131211109876543210ReservedCKD1:0ARPECMSDIROPMURSUDISCENrwrwrwrwrwrwrwrwzrw其中CKD来设置时钟分频,ARPE来使能自动重载预装载,CEN来使能计数器。(2) TIMx_CCMR 1 :定时器捕获比较模式寄存器,如下图所示。151413121110987
5、6543210OC2Ce|OC2M2:0OC2PE| OC2FECC2S1:0OC1CE|CX31M2:Oocipe|ocifeCC1S1:0IC2F3:0IC2PSC(1:0IC1F(3:0IC1PSC(1:0)rw |rw | rw | rwrw J rwrw | rwrwrw | rw | rwrw | rwrw | rwOC1M来配置PWM的模式,PWM模式1, CNTCCR1时为无效状态;PWM模式2, CNTCCR1为有效状态。OC1PE来使能预装载。CC1S来配置通道的输入输出模式(默认为输出模式)。(3) TIMx.CCER:捕获比较使能寄存器,如下图所示。1514131211
6、109876543210ReservedCC4PCC4EReservedCC3PCC3EReservedCC2PCC2EReservedCC1PCC1ErwrwrwrwrwrwrwrwCC1P来配置输出极性,可以选择高电平有效或者低电平有效。CC1E来使能捕获/比较。五、PWM电机控制实验PWM电机控制实验使用STM32的定时器的PWM输出功能,可对飞控上的电机所在的引脚,产生不同占空比的PWM,从而实现让四个电机以不同的速度旋转。(注意:做实验的时候,占空比不要调节过大,该实验会使旋翼转动,要小心无人机的旋翼划伤手)无人机的四个旋翼如下图所示。根据原理图,可以看到四个电机分别由两个AO992
7、6c控制,AO9926c其实想当于是两路的N沟道MOS管,两个AO9926C的四个MOS管的G极(栅极)接口分别是:PB6、PB7、PB8、PB9,如下图所示。no 卜二I CON2GNDH1 卜 T CON2GNDMS10wnTX212RX2 133AT 14SCK TTnso 16MOSI 17LED3 29TX1 10R?;l ITDM 32D?33DIO34PAONKUPPBOPAIPB1PA2B00T1PB2PA3JTD0PB3PA4JNTRSTPB4PA5?B5PA6PB6PA7?B7PASPA9/USART1.TXPA10.USART1.RXPA11PAI 2PA13 JTMS.
8、SUDIOPAI4 TTCKSWCLKPA15JTDIVBAT?.3;STOSCJNPDOOSC.OUT/PD1BOOTOVDD1VDD2VDD3查看数据手册可知,TIM4 CH2、TIM4 CH3、69012 345B B-1 11111PPBBBBBB? PPETEPEPEPEPETAMPER RTCPC13OSC32.IN/PC14OSC32_OUT/PC15VSS_2VDDAVSSA18、1619 !72C CE39 X40 M4 公41 ,乃42 7。43311,45 M222 RX325 CSN26 027 CS228 CS32 LED:3 LED?次233547DGXDPB6、P
9、B7、PB8、PB9 分别对应的是 TIM4_CH1、TIM4.CH4,即定时器4的输出通道14。配置输出PWM的代码编写的思路如下:1管脚配置1、定义结构体;2、使能时钟;3、填充结构体;4、装载结构体。2定时器配置1、定义结构体;2、使能时钟;3、填充结构体;4、装载结构体。3PWM输出参数配置1、定义结构体;2、填充结构体;3、装载结构体;4、使能输出。4改变占空比1、改变占空比参数。定时器PWM输出的初始化代码如下:129 void Tim4_init (void)130 E)(131132133134135136137138139140141142143144145146147148
10、149150151152153154155156157158159160161162163164165166167168169uintl6_t TIM.Prescaler;TIM_TimeBaseInitTypeDefTIM.OCInitTypeDefGPIO.InitTypeDefTIM_TimeBaseStructureTIM_0CInitStructure;GPI0_InitStructure;RCC_APBlPeriphClockCmd(RCC.APBIPeriph_TI4, ENABLE);RCC_APB2PeriphClockCmd(RCCAPB2Periph.GPIOB, ENA
11、BLE);GPIO.InitStructure. GPIOPin = GPI0_Pin_6 | GPI0_Pin_7 | GPIO.Pin.8GPIO.InitStructure. GPIO_Speed = GPI0_Speed_50MHz,GPIO.InitStructure. GPIOJdode = GP10_Mode_AF_PP,GPIO_Init (GPIOB, ftGPIOInitStructure);TIM.Prescaler = SystemCoreClock/(TIMPWMJ/IAX+1)/TIM4_PiW_HZ T;TIM.TimeBaseStructure. TIM.Per
12、iod = T由4_PWM_MAX,TIM_TimeBaseStructure. TIM-Prescaler = TIM_Prescaler;TIM.TimeBaseStructure. TIM.ClockDivision = TIM.CKD.DIVl;TIM_TimeBaseStructure. TIhLCounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);TIM.OCInitStructure. TIM.OCMode = TIM_OCMode_PWIdl,TIM_0CInitStruc
13、ture. TIM.OutputState = TIM_0utputState_Enab1e;TIM.OCInitStructure. TIM.Pulse = TIM4.DUTY;TIM.OCInitStructure. TIM.OCPolarity = TIM.OCPolarity.High;TIM.OClInit(TIM4, ftTIM.OCInitStructure);TIM.OCIPreloadConfig(TIM4, TIM.OCPreload.Enable);TIM_0C2Init(TIM4, ATIM.OCInitStructure);TIM.0C2PreloadConfig(TIM4, TIM_0CPreload.Enable);TIM_0C3Init(TIM4, &TIM.OCInitStructure);TIM0C3PreloadConfig(TIM4, TIM.OCPreload.Enable),TIM_0C4Init(TIM4, &TIM_OCInitStructure);TIM_0C4PreloadConfig(TI