IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【STM32】PWM驱动舵机(TIM3CH2) -> 正文阅读

[嵌入式]【STM32】PWM驱动舵机(TIM3CH2)

[STM32]PWM驱动舵机

思路

1.用PB5输出脉冲信号
2. 了解PWM的原理
3. 了解舵机相关设置
4. 敲代码改bug

相关硬件

STM32C8T6最小系统板
SG90舵机
Jlink
杜邦线

相关知识

舵机

高电平时间对应舵机转动角度

t = 0.5ms——————-舵机会转到 0 °
t = 1.0ms——————-舵机会转到 45°
t = 1.5ms——————-舵机会转到 90°
t = 2.0ms——————-舵机会转到 135°
t = 2.5ms——————-舵机会转到 180°

硬件

橙线:信号线
红线:电源,可以连接3.3V
棕线:地线
SG90舵机地线接32系统板地线,电源接单片机3V3 信号线接预设输出PWM的IO口
在这里插入图片描述

代码

file:main

#include "system.h"
#include "SysTick.h"
#include "pwm.h"
#include "../1127.h"

 int main(void)
 {
		u8 fx=1;
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
		TIM3_CH2_PWM_Init(200-1,7200-1);//7200*200/0000=>0.02s=20ms
	 //0.5ms=0  ->5
	 //1.0ms=45 ->10
	 //1.5ms=90 ->15
	 //2.0ms=135->20
	 //2.5ms=180->25
	 while(1)
	{
		if(fx==1)
			{
			i+=5;
			}
			else
			{
				i-=5;
			}
			if(i>=25) fx=0;
		  if(i==5)  fx=1;
			
			delay(1000);
			LED=!LED;
			TIM_SetCompare2(TIM3,i);//设置占空比
		
		} 
		
	}

file pwm.c

1.头文件以及配置定时器中断服务

#include "pwm.h"
#include "../1127.h"
u8 i =5;
void TIM3_IRQHandler(void)   //TIM3中断
{    
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
		{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
			i++;
		}
}

2.初始化函数

void TIM3_CH2_PWM_Init(u16 per,u16 psc)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/* 开启时钟 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	/*  配置GPIO的模式和IO口 */
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//改变指定管脚的映射	
	
	//测试
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//复用推挽输出
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	GPIO_ResetBits(GPIOC,GPIO_Pin_13);

	
	TIM_TimeBaseInitStructure.TIM_Period=per;   //自动装载值
	TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
	TIM_TimeBaseInitStructure.TIM_ClockDivision=0;
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);	
	
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OC2Init(TIM3,&TIM_OCInitStructure); //输出比较通道2初始化
	
	TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能TIMx在 CCR2 上的预装载寄存器
	TIM_ARRPreloadConfig(TIM3,ENABLE);//使能预装载寄存器
	
	TIM_Cmd(TIM3,ENABLE); //使能定时器
		
}

file: 11.27.h

#ifndef __1127_H__
#define __1127_H__

	void TIM3_CH2_PWM_Init(unsigned short per,unsigned short psc);
	void SysTick_Init(unsigned char SYSCLK);
	void delay(unsigned short	nms);
	
	extern unsigned char i;
	#define LED PCout(13)
#endif

PWM模式相关函数(TIMx_OClnit)

结构体

typedef struct
{
	uint16_t TIM_OCMode; //比较输出模式
	uint16_t TIM_OutputState; //比较输出使能
	//uint16_t TIM_OutputNState; //比较互补输出使能
	uint32_t TIM_Pulse; //脉冲宽度
	uint16_t TIM_OCPolarity; //输出极性
	//uint16_t TIM_OutputNState; //比较互补输出使能

	// uint16_t TIM_OCNPolarity; //互补比较输出极性
	// uint16_t TIM_OCIdleState; //空闲状态下比较输出状态
	// uint16_t TIM_OCNIdleState; //空闲状态下比较输出状态
}TIM_OCInitTypeDef;

解释:
OCMode 输出模式:
PWM1:ARR<CCRx,输出有效电平
PWM2:ARR<CCRx,输出无效电平

OCPolarity 输出极性:
High:高电平有效
Low:低电平有效
[相关寄存器:TIMx_CCER:CCxP,x与CHx有关]

OCOutputState:比较输出使能
应该是为了用TIM_SetComparex(TIMx,i)
Enable:输出使能
Disable:输出失能

OCPulse 占空比:
与设置TIM_SetComparex(TIMx,i)的i应该是一样的

【注释掉的是高级定时器才会用到的,这里不解释】

其他函数

复用功能相关函数

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//AFIO使能
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState) ;//改变指定管脚的映射	

GPIO的复用功能与重映射功能

定时器复用功能对照表

TIMx复用通道部分对照表
其中部分重映像(比如TIM2)不同时,uint32_t GPIO_Remap会出现不同:
PartialRemap1:01时的IO口
PartialRemap2:10时的IO口
uint32_t GPIO_Remap部分定义

void TIM_SetComparex(TIM_TypeDef* TIMx, uint32_t Compare1);
调某通道节占空比函数

对于其他通道,分别有对应的函数名(x=1、2、3、4)

1. void TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
使能 TIMx 在 CCRx 上的预装载寄存器

第一个参数用于选择定时器,
第二个参数用于选择使能还是失能输出比较预装载寄存器,可选择为 TIM_OCPreload_Enable、TIM_OCPreload_Disable。

1. void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
使能 TIMx 在 ARR 上的预装载寄存器允许位

第一个参数用于选择定时器,
第二个参数用于选择使能还是失能。

实验失败解决记录

1.复用特定IO口时无法输出:需要禁用(先看2)

《STM32F103禁用JTAG和SWD接口》

2.禁用特定IO口导致无法烧录

(自己的方法,有效但不知道哪一步有效)
将系统板的BOOT0由0变为1(boot1=0),就能检测到SWD,然后如图设置Erase Full Chip
在这里插入图片描述
download一个正常的程序,加了一个 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, DISABLE);【当时就是用了GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, DISABLE)导致无法下载,慎用!】
boot0=0,能够正常烧录!

3.ZET改C8T6

1.启动文件将.hd改为.md
2.Device:ZET->C8
在这里插入图片描述

3.C/C++:USE_STDPERIPH_DRIVER
在这里插入图片描述

参考

普中,正点原子,野火相关视频,ppt,代码

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-05 12:12:06  更:2021-12-05 12:14:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:05:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码