STM32F103C8T6 实现舵机与电机的控制 2个定时器输出不同频率的PWM

发布者:创意探险最新更新时间:2022-07-28 来源: csdn关键字:STM32F103C8T6  舵机  PWM 手机看文章 扫描二维码
随时随地手机看文章

智能小家居------舵机开门,电机做风扇 or 拉窗帘、呼吸灯做提示,小OLED屏幕显示当前状态。

在这里插入图片描述


直接上代码

背景:我觉得我看了那么多教程了,然而只会玩单个东西,串起来就不太懂。

本项目的代码部分实现用到了2个时钟,TIM2 和 TIM3。

经历的问题:原本我是想只用一个时钟,不同通道来实现PWM的输出,但是我发现 我如果把TIM_TimeBaseInitStructure.TIM_Period = ARR ; //ARR 自动重装器的值

ARR = 20000 -1 时,只能驱动舵机,不能驱动电机。

ARR = 100 -1 时,只能驱动电机,不能驱动舵机。

后来发现: SG90舵机接收的PWM信号频率为50HZ,T=1/f,所以周期为20ms。 当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。

解决方案:所以后来使用了2个时钟,分别输出上面这2个ARR的PWM。

明天准备再加一个呼吸灯功能。

如果你有更好的方案,可以留言或者私信我哦,我们可以交流交流哈哈哈,一起进步呀。


main.c

#include "stm32f10x.h"                  // Device header

#include "Delay.h"

#include "LED.h"

#include "Key.h"

#include "OLED.h"

#include "Servo.h"

#include "PWM.h"

#include "Motor.h"


extern void Motor_Set_Dir(int8_t Speed);

extern void Exti_Test_Pull_Level_Set(void);

//extern void PWM_SetCompare3(uint16_t Compare);


uint8_t i,KeyNum;


int main(void)

{

Key_Init();

OLED_Init();

Servo_Init();

Motor_Init();

OLED_ShowString(1,1,"Angle:");

OLED_ShowString(2,1,"KeyNum:");

OLED_ShowString(3,1,"Speed:");

Servo_Set_Angle(0);//设置舵机初始角度

while (1)

{

KeyNum = Key_GetNum();

Servo_Turn(KeyNum);

Motor_Speed_Set(KeyNum);

}

}


pwm.h

#ifndef __PWM_H

#define __PWM_H


#include "stm32f10x.h"                  // Device header


void Servo_PWM_Init();

void Motor_PWM_Init();

void PWM_SetCompare_Servo(uint16_t Compare);//实际为void PwmCompare()函数

void PWM_SetCompare_Motor(uint16_t Compare);//实际为void PwmCompare()函数


#endif


pwm.c

#include "stm32f10x.h"                  // Device header


#define  TIM2_CH2 GPIO_Pin_1

#define  TIM3_CH1 GPIO_Pin_6


void Servo_PWM_Init()

{

GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体变量

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);  //开启定时器2

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//通道2时钟使能函数


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置GPIO为推挽输出模式

GPIO_InitStructure.GPIO_Pin = TIM2_CH2; //PA1 PA2

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度设置为 50MHz

GPIO_Init(GPIOA, &GPIO_InitStructure); //按照以上参数进行 GPIO的初始化

TIM_InternalClockConfig(TIM2);//TIM的时基单元由内部时钟控制


TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1; //ARR 自动重装器的值

TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; //PSC 预分频器的值 对72M(720000000)进行 7200分频 即10K的频率下 计10000个数 1s的时间

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

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure); 


TIM_OCStructInit(&TIM_OCInitStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性选择

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出状态使能

TIM_OCInitStructure.TIM_Pulse = 20;//CCR,即占空比为 10%

TIM_OC2Init(TIM2,&TIM_OCInitStructure);//OC编号要与通道编号对应


TIM_Cmd(TIM2,ENABLE);

}


void Motor_PWM_Init()

{

GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体变量

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  //开启定时器3

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//通道2时钟使能函数


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置GPIO为推挽输出模式

GPIO_InitStructure.GPIO_Pin = TIM3_CH1; //PA6

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度设置为 50MHz

GPIO_Init(GPIOA, &GPIO_InitStructure); //按照以上参数进行 GPIO的初始化

TIM_InternalClockConfig(TIM3); //内部时钟配置


TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //ARR 自动重装器的值

TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; //PSC 预分频器的值 

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

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); 

TIM_OCStructInit(&TIM_OCInitStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性选择

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出状态使能

TIM_OCInitStructure.TIM_Pulse = 50;//CCR,即占空比为 10%

TIM_OC1Init(TIM3,&TIM_OCInitStructure);//OC编号要与通道编号对应

TIM_OC2Init(TIM3,&TIM_OCInitStructure);//OC编号要与通道编号对应


TIM_Cmd(TIM3,ENABLE);

}


void PWM_SetCompare_Servo(uint16_t Compare)

{//TIM2_CH2 GPIO_Pin_1

TIM_SetCompare2(TIM2, Compare);

}


void PWM_SetCompare_Motor(uint16_t Compare)

{//TIM3_CH1 GPIO_Pin_6

TIM_SetCompare1(TIM3, Compare);


servo.h

#ifndef __Servo_H

#define __Servo_H


#include "stm32f10x.h"                  // Device header


void Servo_Init(void);

void Servo_Set_Angle(float Angle);

void Servo_Turn(uint8_t KeyNum);


#endif


servo.c

#include "stm32f10x.h"                  // Device header

#include "PWM.H"

#include "OLED.h"


float Angle;

void Servo_Init(void)

{

Servo_PWM_Init();

}


void Servo_Set_Angle(float Angle)

{

PWM_SetCompare_Servo(Angle / 180 * 2000 +500);

}


void Servo_Turn(uint8_t KeyNum)

{

//因为我板子上只有1个按键可以用,所以我用这两个引脚模拟按键

if(KeyNum == 1)//PB1           

{

Angle = 0;

}

if(KeyNum == 2)//PB11

{

Angle = 180;

}

Servo_Set_Angle(Angle);//执行电机转角

OLED_ShowNum(1,7,Angle,3);

}


motor.h

#ifndef __MOTOR_H

#define __MOTOR_H


#include "stm32f10x.h"                  // Device header


void Motor_Init();

void Motor_Set_Dir(int8_t Speed);

void Motor_Speed_Set(uint8_t KeyNum);


#endif


motor.c

该功能有用到TB6612FNC电机驱动模块,用PWM来控制 直流电机的转速


#include "stm32f10x.h"                  // Device header

#include "PWM.h"

#include "Delay.h"

#include "OLED.h"


uint8_t Speed;


void Motor_Init()

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//通道2时钟使能函数

GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体变量

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //设置GPIO为推挽输出模式

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;//电机方向控制脚

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度设置为 50MHz

GPIO_Init(GPIOA, &GPIO_InitStructure); //按照以上参数进行 GPIO的初始化

Motor_PWM_Init();

}


void Motor_Set_Dir(int8_t Speed)

{

if(Speed >= 0)

{

GPIO_SetBits(GPIOA, GPIO_Pin_4);

GPIO_ResetBits(GPIOA, GPIO_Pin_5);

PWM_SetCompare_Motor(Speed);

}

else

{

GPIO_ResetBits(GPIOA, GPIO_Pin_4);

GPIO_SetBits(GPIOA, GPIO_Pin_5);

PWM_SetCompare_Motor(-Speed);

}

}


void Motor_Speed_Set(uint8_t KeyNum)

{

if(KeyNum == 3)

{

Delay_ms(200);

Speed += 20;

if(Speed > 100)

{

Speed = -100;

}

}

OLED_ShowNum(3,7,Speed,3);

OLED_ShowNum(2,8,KeyNum,1);

Motor_Set_Dir(Speed);

}


关键字:STM32F103C8T6  舵机  PWM 引用地址:STM32F103C8T6 实现舵机与电机的控制 2个定时器输出不同频率的PWM

上一篇:STM32跑马灯实验——库函数版本
下一篇:STM32 PWM周期与频率的计算

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

stc12单片机LED_PWM调光
本程序一共有3个文件下面分别列出: stc12c5a.h 头文件下载: http://www.51hei.com/mcu/3282.html main.c #include stc12c5a.h #include type.h #define FRE 22118400 #define TIME_FRE 10000 //计时1/10000=0.0001s=0.1ms (此时间是用来加快LED闪烁频率) #define T0RELOAD (65536 - (FRE / TIME_FRE)) //***************************************初始化变量 v
[单片机]
stc12单片机LED_<font color='red'>PWM</font>调光
74hc595+4根IO口线驱动1602,带PWM调光
呵呵,不用我说你们也知道为什么只需要4根线:因为咱用了74hc595啊!因为74HC595最近我手里一抓一大把。但是STC的单片机IO口紧缺。就算使用4线驱动模式也要8个IO(还要算上背光PWM)。这一次我几乎做到了他的一半。如果不用PWM的话。大概只需要3个IO,如果需要PWM就四个罗。 MCU当然是老掉牙的死特惨89C52罗~ 也可以在595后面级联类似三极管开关 继电器之类的玩意。当然友情提醒,别超过4个595.否则速度会慢的可怕。我现在1个595.写1602都可以丢掉延时函数了。 这一次硬件设计的比较简单,但是IO全反了。所以需要占用额外的CPU时间修正,但是毕竟方便洞洞板嘛。还有大家别看到我给
[单片机]
74hc595+4根IO口线驱动1602,带<font color='red'>PWM</font>调光
STM32F103C8T6 开发板 + 机智云 IoT + 智能家居环境控制
随着计算机技术、通信技术、网络技术的发展及互联网的日益普及,人们对传统的家居环境也提出了新的要求,人们在信息化社会中需要的不仅仅是舒适的居家环境,更需要一个智能化、信息化的智能家居系统,智能家居逐渐成为未来家居生活的发展方向。然而,目前的智能家居系统配置较为复杂,添加设备繁琐,普通用户很难会使用。若能降低其操作难度,做到即插即用、提供在线升级的服务,新版本能够完全兼容老版本,这样极大地节约消费者的使用成本,使智能家居真正走进人们的日常生活。 本项目设计了一款智能家居环境控制器。通过家居环境控制器可以实时掌握室内环境的温度、湿度及光照度,并可以通过手机平台对温度进行远程调控,同时设计了远程开关,可以用手机远程控制家居中的有关设备。
[单片机]
<font color='red'>STM32F103C8T6</font> 开发板 + 机智云 IoT + 智能家居环境<font color='red'>控制</font>器
基于LabVIEW步进电机控制
步进电机是一种将电脉冲信号转换成角位移或线位移的机电元件。它在在工业自动化控制、数控机床、机器人等领域有着广泛的应用。在远程实验系统中,经常有需要利用步进电机对一些旋钮、位置等进行自动调节。本文设计了基于虚拟仪器技术的步进电机控制方案。该方案采用虚拟仪器控制步进电机,编程简单,界面友好,易于更改程序功能,控制灵活性得到了提高。 1 步进电机工作原理 步进电机按其力矩产生原理可以分为反应式、永磁式和混合式几种。本文采用的是反应式二相四线步进电机,定子有两个线圈绕组,设其中一个线圈绕组为A相,另一个线圈绕组为B相。当给A相绕组通电时,该绕组即产生磁场,转子齿与A相绕组各齿对齐;当给B相绕组通电时,转子齿将与B相绕组各齿对齐,这样,转子
[测试测量]
基于LabVIEW<font color='red'>的</font>步进<font color='red'>电机</font><font color='red'>控制</font>
基于8000B变频器设计高速电机控制方案
概述 高速电机通常是指转速超过10000r/min的电机。它们具有以下优点:一是由于转速高,所以电机功率密度高,而体积远小于功率普通的电机,可以有效的节约材料。二是可与原动机相连,取消了传统的减速机构,传动效率高,噪音小。三是由于高速电机转动惯量小,所以动态响应快。 高速电机一般应用于数控雕刻机、木工雕铣机、精密磨床、高速离心设备等;尤其是精密的数控机加工行业,一般采用高速电机控制,其中电机的运行转速一般会在0-24000转/分。高速加工技术越来越受到人们的关注,它不仅可获得更大的生产率,而且还可获得很高的加工质量,并 可降低生产成本。 工艺要求 1、运行转速高,一般要求变频器的输出频率能达到0-400HZ。 2、电
[嵌入式]
基于步进电机驱动芯片和核步法实现闭环控制电路设计
步进电机是将电脉冲信号转换成角位移或线位移的一种装置。它产生的位移与输入脉冲数严格成正比,平均转速与输入脉冲的频率成正比,具有结构简单、可靠性高和成本低的特点。由于步进电机没有积累误差,容易实现较高精度的位移和速度控制,被广泛用于精确控制领域。由步进电机与驱动电路组成的开环数控系统简单并且价格低廉,但有时存在振荡和失步现象,故在复杂电磁环境下或是对精度要求较高的场合下,必须加入反馈电路组成高性能的闭环数控系统。本文采用旋转编码器作为反馈器件对步进电机实行闭环控制。 1THB6064H简介 THB6064H是在东芝公司2009年主推的TB6560AHQ的基础上开发的一款PWM斩波型两相步进电机驱动芯片。该芯片配合简单的外围电路即
[嵌入式]
基于步进<font color='red'>电机</font>驱动芯片和核步法实现闭环<font color='red'>控制</font>电路<font color='red'>的</font>设计
IR CHiL数字PWM控制器系列
    全球功率半导体和管理方案领导厂商 – 国际整流器公司 (International Rectifier,简称IR) 推出新一代电源管理总线 (PMBus) 驱动的多功能CHiL数字脉冲宽度调制 (PWM) 控制器,和集成式PowIRstage解决方案,可在多种中端到高端服务器、桌面和运算应用内大幅提升效率、缩减电路板空间及减少部件数量。       IR全新的数字控制器符合Intel VR12和VR12.5的规格,并支持一到两个环路操作、一相位到八相位的多相位设计。这些数字控制器可与7款新的PowIRstage产品配合使用,为中央处理器和DDR内存应用提供经过优化的高性能端到端多相位解决方案。       这些新一代
[电源管理]
IR CHiL数字<font color='red'>PWM</font><font color='red'>控制</font>器系列
大型火电机组现场总线控制系统设计探讨
一、现场总线标准及结构选择   目前,国际现场总线还未形成统一的标准,适用于火电机组自动化控制系统的现场总线主要有德国西门子公司研发的 Profibus现场总线和国际现场总线基金会组织研发的基金会现场总线(FF)等。Profibus现场总线为国际现场总线标准 IEC61158的组成部分,其分类为Type3,主要由Profibus-PA、Profibus-DP组成,Profibus-DP的数据传输速率为9.6kbit/s ~12Mbit/s, Profibus-PA的数据传输速率为31.25kbit/s。FF与Profibus现场总线相同,为国际现场总线的组成部分,其分类为Type l和Type 5,主要有Hl和H2 2种通讯速率。H
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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