完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32控制舵机(多个舵机、附代码)
1、基本介绍 2、代码 #include “bsp_servo.h” void Servo_PWM_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;//定义定时器结构体变量 TIM_OCInitTypeDef TIM_OCInitStructure;//定义输出比较结构体变量 GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //GPIOB时钟使能 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能复用时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//配置GPIO引脚 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置GPIO速率 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//配置GPIO为复用推挽输出 GPIO_Init(GPIOB,&GPIO_InitStructure);//GPIO初始化函数 TIM_TimeBaseStruct.TIM_Period=9999;//设置自动重装载的周期值,计算方法多了 TIM_TimeBaseStruct.TIM_Prescaler=143;//设置预分频系数 TIM_TimeBaseStruct.TIM_ClockDivision=0;//设置时钟分割,0同TIM_CKD_DIV1 TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式 TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStruct);//定时器初始化函数 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//PWM模式1 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//输出比较极性高 //多舵机,怎么控制,当然是同一个定时器下的4个通道了,所以,下面的8句就很重要。 TIM_OC1Init(TIM4,&TIM_OCInitStructure);//比较输出初始化函数,通道1 TIM_OC2Init(TIM4,&TIM_OCInitStructure);//比较输出初始化函数,通道2 TIM_OC3Init(TIM4,&TIM_OCInitStructure);//比较输出初始化函数,通道3 TIM_OC4Init(TIM4,&TIM_OCInitStructure);//比较输出初始化函数,通道4 TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable); //输出比较1预装载寄存器使能 TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);//输出比较2预装载寄存器使能 TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);//输出比较3预装载寄存器使能 TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);//输出比较4预装载寄存器使能 TIM_Cmd(TIM4,ENABLE);//TIM4使能,忘了就前功尽弃了 } 头文件 #ifndef __SERVO_H #define __SERVO_H #include “stm32f10x.h” #include “stm32f10x_rcc.h” #include “stm32f10x_tim.h” void Servo_PWM_Init(void); #endif 最后,最关键的来了,如何使用呢?当然是一句函数了。修改定时器下某一个通道的函数,TIM_SetCompare1(TIM4, 500); 注意:修改哪一个通道的占空比,就要把那个数字1修改为几。 main函数中调用 int main() { /*初始化此处省略*/ while(1) { TIM_SetCompare1(TIM4,400);//时间到关闭 delay_ms(500);//此处就看你舵机性能了,连续动作时,如果能反应过来,就不用加延时了,自己实践找规律吧。 TIM_SetCompare1(TIM4,1000);//时间到关闭 delay_ms(500); //其它舵机也是一样的,TIM_SetCompareX(TIM4,Compare);//时间到关闭 } } 3、备注 关于不同占空比,对应舵机的角度,这个自己探索吧。计算也很好理解。 4、如果有错误,请大家积极指出,多谢。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1602 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1536 浏览 1 评论
967 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
680 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1579 浏览 2 评论
1860浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
640浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
513浏览 3评论
527浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
500浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 12:28 , Processed in 0.986206 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号