1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180°角度伺服为例,那么对应的控制关系是:
舵机转动0°代表它的占空比是2.5%,转动180°代表它的占空比是12.5%。 设arr(自动重装载值)为x时 转动角度所对应的值=(x+1)*(1-占空比)(将pwm极性设置为TIM_OCPolarity_High时) 转动角度所对应的值=(x+1)*占空比(将pwm极性设置为TIM_OCPolarity_Low时) PWM信号的周期计算公式: 周期=(arr+1)*(psc+1)/CLK。其中CLK为计数器的时钟频率,不分频情况是72MHz。 这里我使用的是正点原子的STM32F103ZET6,程序也是在它的基础上改的。已经跑过了,舵机可以实现0-180°转动。 timer.c #include "timer.h" void TIM3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//改变相应的引脚号和时钟号,就能有不同的引脚PWM输出,此处是PA.7,TIM3_CH1没有重映射 //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //是否启用重映射 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); //GPIO_SetBits(GPIOA,GPIO_Pin_1);//初始为低电平,可有可无 //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);//是否启用重映射 TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitstruct.TIM_Period=arr; TIM_TimeBaseInitstruct.TIM_Prescaler=psc; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstruct); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高 TIM_OC2Init(TIM3, &TIM_OCInitStructure); //初始化 TIM3 OC1 TIM_Cmd(TIM3, ENABLE); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); } main.c #include "stm32f10x.h" #include "delay.h" #include "timer.h" int main() { u16 delay_time = 1000; delay_init(); // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); TIM3_PWM_Init(1999,719);//这里的arr的值和psc的值可以修改,只要在不分频情况下为72MHZ while(1) { delay_ms(delay_time); TIM_SetCompare2(TIM3, 1750); //对应180度 delay_ms(delay_time); TIM_SetCompare2(TIM3, 1800); //对应135度 delay_ms(delay_time); TIM_SetCompare2(TIM3, 1850); //对应90度 delay_ms(delay_time); TIM_SetCompare2(TIM3, 1900);//对应45度 delay_ms(delay_time); TIM_SetCompare2(TIM3, 1950); //对应0度 delay_ms(delay_time); } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1763 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1617 浏览 1 评论
1059 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
723 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1670 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
726浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
592浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 17:14 , Processed in 0.863366 second(s), Total 76, Slave 60 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号