完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1.SG90舵机官方数据
尺寸:21.5mmX11.8mmX22.7mm 重量:9克 (1kg=1公斤=2斤) 无负载速度:0.12秒/60度(4.8V) 0.002s/度 堵转扭矩:1.2-1.4公斤/厘米(4.8V) 使用温度:-30~~+60摄氏度 死区设定:7us (7MHZ) 工作电压:4.8V-6V 位置等级:1024级 脉冲控制精度为2us 2.操作技巧 1.采用PWM控制的方式来进行舵机的操纵 2.舵机的控制需要MCU产生一个20ms的脉冲信号,以0.5ms到2.5ms的高电平来控制舵机的角度 3.数据: 0.5ms-------------0度; 2.5% 1.0ms------------45度; 5.0% 1.5ms------------90度; 7.5% 2.0ms-----------135度; 10.0% 2.5ms-----------180度; 12.5% 4.关键函数: TIM_SetCompare1(TIM1,cout); TIM1:TIM1->arr(预装载值),cout值为自设 通过改变cout的值从而进行cout和预装载值的比较 从而控制高电平时间 0.5ms-2.5ms这段高电平时间越长舵机转过角度越大,0.5ms舵机就转过0°,2.5ms舵机就转到最大角度(大概185°) 3.相关代码操作: part1:PWM初始化 #include "pwm.h" #include "led.h" //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM1_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIO外设时钟使能 //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 不分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高 TIM_OC1Init(TIM1, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能 TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1预装载使能 TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器 TIM_Cmd(TIM1, ENABLE); //使能TIM1 } part2:main.c //使用stm32控制舵机的使用 #include "led.h" #include "delay.h" #include "sys.h" #include "pwm.h" #include "key.h" #define key1 PCin(5) #define key2 PAin(15) #define key3 PAin(0) //key1 key2 低电平触发 //key3 高电平触发 u16 cout; int main(void) { cout=1850; KEY_Init(); delay_init(); //延时函数初始化 LED_Init(); //初始化与LED连接的硬件接口 TIM1_PWM_Init(1999,719); //PWM频率===(2000*720)/72000000=0.02=20ms 使用一个20ms的脉冲周期 //每20ms进入一次中断 官方数据为数据每加1则转动1.85度 while(1) { if(key3==0&&key1==0) //key1按下,舵机缓慢正向转动 { if(key1==0) { delay_ms(5);//消抖 cout+=2; } } #if 0 else if(key3==1&&key1==0) //key1、key3同时按下,舵机加速转动 { delay_ms(5); cout+=1; } #endif if(key3==1) //舵机回到90度(起始位置)key3为校正位 { cout=1850; } if(key3==0&&key2==0) //key2按下,舵机缓慢反向转动 { delay_ms(5); cout-=2; } #if 0 else if(key3==1&&key2==0) //key2、key3同时按下,舵机加速转动 { delay_ms(5); cout-=5; } #endif TIM_SetCompare1(TIM1,cout); //PWM输出(比较模式) delay_ms(50); } } 注: 1.此方式是对于180度舵机有效 2.cout的值设置为180度 刚好是舵机旋转90度,进行数值的加减可以控制舵机的正反转动 |
|
|
|
只有小组成员才能发言,加入小组>>
2438 浏览 0 评论
9118 浏览 4 评论
36800 浏览 19 评论
5031 浏览 0 评论
24775 浏览 34 评论
1537浏览 2评论
1757浏览 1评论
2204浏览 1评论
1563浏览 0评论
534浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 00:23 , Processed in 1.437982 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号