stm32f103c8t6利用蓝牙控制180度舵机

发布者:AdventureSeeker最新更新时间:2022-09-07 来源: csdn关键字:stm32f103c8t6  蓝牙控制 手机看文章 扫描二维码
随时随地手机看文章

关于蓝牙模块部分,如果不了解蓝牙模块的可以看我之前发的东西。

一般来说,舵机接收的PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。以180度角度舵机为例,那么对应的控制关系是这样的:

0.5ms--------------0度;

1.0ms------------45度;

1.5ms------------90度;

2.0ms-----------135度;

2.5ms-----------180度;

关于舵机的话,本人用的是6~8.4V的的60KG大舵机,这里需要注意的是, 控制板上面只提供5V电压,满足不了这种舵机的电压,所以我利用12V的锂电池,让锂电池的正负极接在降压模块输入端的正负极,接着让降压模块输出端的正负极接舵机的正负极,也就是说舵机是独立供电的,最重要的一点就是舵机外接电源的GND需要和控制板的GND接在一起,也就是共地,这样舵机才能转动,否则是转动不了的,如果你用的是5V的舵机,虽然大多数情况直接接控制板的正负极可以让舵机转动,但是这样电压不稳定,会导致舵机转动一个角度后就卡死了,所以本人建议舵机最好都给他个独立的电源,这样舵机就能连续转动,不会产生卡死状态。以下是本人所用的降压模块和60K大舵机的图片及视频效果,这种大舵机速度比较慢,但是扭矩大。

以下的舵机VCC->降压模块的VCC

舵机的GND->降压模块的GND

舵机的信号线->stm32控制板的PB5(TIM3_CH2)

在这里插入图片描述

下面附上主程序:


#include "led.h"

#include "delay.h"

#include "key.h"

#include "sys.h"

#include "usart.h"

#include "timer.h"

 


extern u8 res;

 int main(void)

 {

int len;

int t;

int i;  

delay_init();     //延时函数初始化   

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

uart_init(115200); //串口初始化为115200

My_USART2_Init();

  TIM1_PWM_Init(199,7199); //不分频。T为20ms,这样的配置就是为了让输出的PWM信号达到舵机要求的20ms周期。

    while(1)

{

if(res=='1'){TIM_SetCompare2(TIM3,175);delay_ms(1000);}对应180度

if(res=='2'){TIM_SetCompare2(TIM3,180);delay_ms(1000);}对应135度

if(res=='3'){TIM_SetCompare2(TIM3,185);delay_ms(1000);}对应90度

if(res=='4'){TIM_SetCompare2(TIM3,190);delay_ms(1000);}对应45度

if(res=='5'){TIM_SetCompare2(TIM3,195);delay_ms(1000);}对应0度

//在周期20ms的PWM信号中,不同的脉宽对应舵机不同的转动角度,在0.5ms-2.5ms间有效  

// TIM_SetCompare2(TIM4,175);//总共计数200,前面设置的模式是计数在比较值之后才是高电平

//也就是高电平的时间是[(200-175)/200]*20ms=2.5ms,即转过360度,180度舵机依次类推

}  

 }


子程序:


#include "timer.h"

#include "led.h"

#include "usart.h"

void TIM1_PWM_Init(u16 arr,u16 psc)

{  

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

TIM_OCInitTypeDef  TIM_OCInitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO , ENABLE);  

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); 

 

   //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形 GPIOA.8

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH1

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

 

   //初始化TIM1

TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值

TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

// TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重复计数器的值

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

//初始化TIM1 Channel1 PWM模式  

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

//TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高

//TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;//输出通道空闲电平极性设置

TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

//TIM_OC4Init(TIM1, &TIM_OCInitStructure);


TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM1在CCR1上的预装载寄存器

// TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); 

 

TIM_Cmd(TIM3, ENABLE);  //使能TIM1

//TIM_CtrlPWMOutputs(TIM1, ENABLE);//主输出使能,当使用的通用定时器时,这句不需要


}


如果在定时器初始化时TIM_OCInitStructure.TIM_OCMode配置的是PWM1模式那么main中的占空比就依次为25、20、15、10、5。下面解释一下模式PWM1和模式PWM2的区别:

假定TIM_OCInitTypeDef.TIM_OCPolarity = TIM_OCPolarity_High

若TIM_OCInitTypeDef.TIM_OCMode = TIM_OCMode_PWM1时:

当计时器值小于比较器设定值时则TIMX输出脚此时输出有效高电位。

当计时器值大于或等于比较器设定值时则TIMX输出脚此时输出低电位。

若TIM_OCInitTypeDef.TIM_OCMode = TIM_OCMode_PWM2时:

当计时器值小于比较器设定值时则TIMX输出脚此时输出有效低电位。

当计时器值大于或等于比较器设定值时则TIMX输出脚此时输出高电位。

本人用的是PWM2模式,在你们自己试验时,可以将占空比设置成各种不同的值,看看有什么不同的效果。


关键字:stm32f103c8t6  蓝牙控制 引用地址:stm32f103c8t6利用蓝牙控制180度舵机

上一篇:stm32c8t6利用语音识别与播报检测DHT11温湿度
下一篇:stm32和电机开发(直流有刷电机和步进电机)

推荐阅读最新更新时间:2024-11-13 11:42

W801/W800-wifi-socket开发(二)-UDP蓝牙控制wifi连接
本文使用环境: 主控:W800-KIT (开发板) 兼容:W800 W801 AIR101 开发环境:CDK SDK:W801/W800的SDK(tls库) 前文: W801/W800-wifi-socket开发(一)-UDP W801蓝牙收发数据与控制设计(一)-INDICATE W801蓝牙收发数据与控制设计(二)-NOTIFY方式 本文github工程 这份代码包含前文的某些函数,所以可能会比较乱。 写在前面: 这个代码有很多地方都有BUG,有遇到的请联系我修改。比如未对传输的数据进行严格筛查,每次都要重新输入账户和密码,可以将数据写入flash。。。。因为只是一个基础的学习思路,所以并未深入完善代码。
[单片机]
W801/W800-wifi-socket开发(二)-UDP<font color='red'>蓝牙</font><font color='red'>控制</font>wifi连接
STM32F103C8T6中断特征介绍 用按钮为STM32 MCU触发一个中断
中断是MCU的特征之一,STM32F103C8T6也不例外。以下通过STM32F103C8T6 Blue Pill外接一个按钮,向MCU触发外部中断。 STM32F103C8T6中断特征 中断有硬件中断和软件中断两种,当一个中断发生时,相应的中断服务程序(ISR)和中断处理程序就开始运行了。其中,ISR的指令必须尽可能小,ISR中也不能出现delay ()之类的阻塞函数。 STM32 Blue Pill或者STM32F103C8T6 MCU指定NVIC来管理所有外部中断和外设中断,其应用采用了Arduino IDE。因此,我们可使用相同的句法来配置外部中断,这可通过以下称作 “attachInterrupt ()” 的句法
[单片机]
<font color='red'>STM32F103C8T6</font>中断特征介绍 用按钮为STM32 MCU触发一个中断
贸泽开售Renesas RX23W低功耗蓝牙模块为物联网控制提供支持
2021年8月16日 – 专注于引入新品的全球电子元器件授权分销商贸泽电子 (Mouser Electronics) 即日起备货Renesas Electronics RX23W模块。该模块集成了天线和振荡器,并采用6.1mm × 9.5mm紧凑封装,为物联网 (IoT) 终端设备的系统控制和无线通信提供全面的低功耗蓝牙5.0支持。 贸泽分销的Renesas RX23W模块集成了RX23W微控制器,支持完整的低功耗蓝牙5.0通信,包括长距离传输、2Mbps数据吞吐量,以及在125kbps下具备−105dBm接收灵敏度。该模块可使用Renesas的Trusted Secure IP安全功能来提供强大的保护,从而阻止窃听、篡改和病
[物联网]
贸泽开售Renesas RX23W低功耗<font color='red'>蓝牙</font>模块为物联网<font color='red'>控制</font>提供支持
STM32F103C8T6串口通讯说明
对于USART初始化结构体的说明 初始库函数定义在stm32f10x_usart.c 文件中,即USART_InitTypeDef。 USART_BaudRate:波特率设置。一般设置为 2400、9600、19200、115200。波特率越高,传输速率越快。 USART_WordLength:数据帧字长,可选 8 位或 9 位。我们一般使用8位。 一个字符帧发送需要三个部分:起始位 + 数据帧 + 停止位。 起始位是一个位周期的低电平,位周期就是每一位占用的时间;数据帧就是我们要发送的 8 位或 9 位数据,数据是从最低位开始传输 的;停止位是一定时间周期的高电平。 为什么是9位?STM32F103 系列
[单片机]
W801/W800蓝牙收发数据与控制设计(一)-INDICATE
本文使用环境: 主控:W801 (开发板) 兼容:W800 AIR101 一、项目概述 ^^^^这篇教程主要介绍W801的BT使用,之前我一直存在畏难情绪,看着官方提供的硕大的SDK,难以下手。幸亏有前辈将BT剥离了出来,因此本文在前辈的基础上进一步完善程序,并将程序上传github,供大家参考。本文github地址。 ^^^^程序功能: 通过手机蓝牙控制开发板的多个LED亮灭,同时开发板通过蓝牙返回收到的数据。 注意: 在蓝牙发送数据时,数据长度必须要小于254,否者接收不成功,同时数据接收按照u8类型接收,大家可以根据实际情况进行修正。 二、程序设计 1、修改demo文件 ^^^^打开 wm_demo.h文件,
[单片机]
W801/W800<font color='red'>蓝牙</font>收发数据与<font color='red'>控制</font>设计(一)-INDICATE
基于STM32F103C8T6的PWM信号控制电机驱动器与点灯代码实例
STM32是一系列由STMicroelectronics生产的32位ARM微控制器。它们被广泛应用于各种应用领域,如工业控制、汽车电子、嵌入式系统、通讯、医疗设备等。STM32具有低功耗、高性能、高可靠性的特点,支持多种通信接口和众多的外设,可满足不同应用领域的需求。 STM32F103器件采用Cortex-M3内核,CPU最高速度达72 MHz。该产品系列具有16KB ~ 1MB Flash、多种控制外设、USB全速接口和CAN。 STM32F103C8T6是一款基于ARM Cortex-M 内核STM32系列的32位的微控制器,程序存储器容量是64KB,需要电压2V~3.6V,工作温度为-40°C ~ 85°C。STM
[单片机]
基于<font color='red'>STM32F103C8T6</font>的PWM信号<font color='red'>控制</font>电机驱动器与点灯代码实例
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved