标题:
stm32蓝牙控制舵机问题:想知道如何实现蓝牙控制舵机慢慢转动
[打印本页]
作者:
yyds0606
时间:
2021-7-19 16:26
标题:
stm32蓝牙控制舵机问题:想知道如何实现蓝牙控制舵机慢慢转动
#include "stm32f10x.h"
#include "usart.h"
#include "timer.h"
#include "duoji.h"
#include "delay.h"
#include "math.h"
#include "sys.h"
void delay(u8 count)
{
for(; count!=0 ; count--);
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)
usart_Init()
TIM3_PWM_Init(199,7199)
// TIM2_PWM_Init(199,719
while(1)
{
}
}
void USART1_IRQHandler(void
{
u8 res;
res=USART_ReceiveData(USART1)
switch(res)/
{
case'6':duoji1();
TIM_SetCompare3(TIM3,180);
break;
case'7':duoji2();
TIM_SetCompare3(TIM3,175);
break;
}
}
舵机
#include "duoji.h"
#include "stm32f10x.h"
#include "delay.h"
void TIM3_PWM_Init(u16 arr, u16 psc)
{
GPIO_InitTypeDef GPIO_InitTypeSture;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeSture;
TIM_OCInitTypeDef TIM_OCInitTypeStrue;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeSture.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitTypeSture.GPIO_Pin = GPIO_Pin_0;
GPIO_InitTypeSture.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitTypeSture);
TIM_TimeBaseInitTypeSture.TIM_Period = arr;
TIM_TimeBaseInitTypeSture.TIM_Prescaler = psc;
TIM_TimeBaseInitTypeSture.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitTypeSture.TIM_ClockDivision = 0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitTypeSture);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);
TIM_OCInitTypeStrue.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitTypeStrue.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitTypeStrue.TIM_Pulse = 0;
TIM_OCInitTypeStrue.TIM_OutputState = TIM_OutputState_Enable;
TIM_OC1Init(TIM3, &TIM_OCInitTypeStrue);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3, ENABLE);
}
void TIM2_PWM_Init(u16 arr, u16 psc)
{
GPIO_InitTypeDef GPIO_InitTypeSture;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeSture;
TIM_OCInitTypeDef TIM_OCInitTypeStrue;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeSture.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitTypeSture.GPIO_Pin = GPIO_Pin_3;
GPIO_InitTypeSture.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitTypeSture);
TIM_TimeBaseInitTypeSture.TIM_Period = arr;
TIM_TimeBaseInitTypeSture.TIM_Prescaler = psc;
TIM_TimeBaseInitTypeSture.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitTypeSture.TIM_ClockDivision = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitTypeSture);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);
TIM_OCInitTypeStrue.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitTypeStrue.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitTypeStrue.TIM_Pulse = 0;
TIM_OCInitTypeStrue.TIM_OutputState = TIM_OutputState_Enable;
TIM_OC1Init(TIM2, &TIM_OCInitTypeStrue);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_Cmd(TIM2, ENABLE);
}
void duoji1(void)
{
// TIM_SetCompare1(TIM3,195);
// delay_ms(1000
// TIM_SetCompare1(TIM3,190);
// delay_ms(1000
// TIM_SetCompare1(TIM3,185);
delay_ms(1000);
TIM_SetCompare3(TIM3,180);
// delay_ms(1000
// TIM_SetCompare1(TIM3,175);
// delay_ms(1000
}
//void duoji12(void
/
// TIM_SetCompare1(TIM3,175);
// delay_ms(1000
// TIM_SetCompare1(TIM3,180);
// delay_ms(1000
// TIM_SetCompare1(TIM3,185);
// delay_ms(1000
// TIM_SetCompare1(TIM3,190);
// delay_ms(1000
// TIM_SetCompare1(TIM3,195);
// delay_ms(1000
/
void duoji2(void)
{
// TIM_SetCompare1(TIM2,195);
// delay_ms(1000
// TIM_SetCompare1(TIM2,190);
// delay_ms(1000
// TIM_SetCompare1(TIM2,185);
// delay_ms(1000
// TIM_SetCompare1(TIM2,180);
// delay_ms(1000
TIM_SetCompare3(TIM3,175);
delay_ms(1000);
}
//void duoji22
/
// TIM_SetCompare1(TIM3,175);
// delay_ms(1000
// TIM_SetCompare1(TIM3,180);
// delay_ms(1000
// TIM_SetCompare1(TIM3,185);
// delay_ms(1000
// TIM_SetCompare1(TIM3,190);
// delay_ms(1000
// TIM_SetCompare1(TIM3,195);
// delay_ms(1000
/
作者:
1092648746
时间:
2021-7-19 17:31
TIM_SetCompare1 这个应该是控制单片机PWM的函数吧,通过定时调整函数 可以调整PWM的输出波形,舵机每个角度有对应的PWM频率和周期。蓝牙一般都用的模块吧,直接AT指令,串口发送和接收字符串就行。
作者:
yyds0606
时间:
2021-7-19 17:34
1092648746 发表于 2021-7-19 17:31
TIM_SetCompare1 这个应该是控制单片机PWM的函数吧,通过定时调整函数 可以调整PWM的输出波形,舵机每个 ...
如果想要让舵机任意转动角度,经过蓝牙发送指令点一下舵机转一下该怎么实现呢?
作者:
77599585
时间:
2021-7-20 10:10
新建一个变量, 用你的蓝牙操作去修改那个变量, 再由变量去修改舵机的角度.
类似这种
u8 degree = 90;
set_pwm(degree);
作者:
yyds0606
时间:
2021-7-20 15:14
可不可以用一个循环
TIM3_PWM_Init(199,7199);
TIM_SetCompare1(TIM3,i);
然后对i进行叠加,实现度数的微小变化
作者:
轩辕顶托
时间:
2021-7-20 15:38
控制舵机旋转方法:
1、控制信号(如图H)是一种脉宽调制(PWM)信号,凡是微控制器能轻松的产生这种信号。在此文中,我用的是常用的Arduino开发环境下的微控制器。
2、 脉冲的高电平持续1到2毫秒(ms),也就是1000到2000微秒(μs)。在1000μs时,舵机左满舵。在2000μs时,右满舵。不过你可以通过调整脉宽来实现更大或者更小范围内的运动。
3、控制脉冲的低电平持续20毫秒。每经过20毫秒(50次每秒),就要再次跳变为高电平,否则舵机就可能罢工,难以保持稳定。不过你要是想让它一瘸一拐的跳舞,倒可以采取这种方法。
1、什么是舵机:在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。
2、工作原理:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。当然我们可以不用去了解它的具体工作原理,知道它的控制原理就够了。就象我们使用晶体管一样,知道可以拿它来做开关管或放大管就行了,至于管内的电子具体怎么流动是可以完全不用去考虑的。
作者:
湖南
时间:
2021-8-4 15:04
单片机输出不同的PWM即可实现
作者:
小白一个呀
时间:
2021-8-4 19:45
加个PID可以很平缓控制
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1