STM32-PWM波-控制舵机

发布者:LovingLife2023最新更新时间:2018-06-18 来源: eefocus关键字:STM32  PWM波  控制舵机 手机看文章 扫描二维码
随时随地手机看文章

寄存器配置stm32设备
1、使能外设的时钟:APB1ENR,APB2ENR
2、配置寄存器或者说是控制寄存器。在配置stm32外设时,任何时候都要先使能该外设的时钟!而每个控制寄存器,很有可能包括了,1模式寄存器,2使能寄存器,3才可能是我们认为的数据寄存器或者内容寄存器。
3、使能外设。即使配置好了,没有使能外设,则外设永远不会工作,这一点比较容易遗忘。

寄存器配置,请查看
http://wenku.baidu.com/link?url=NE4LMJFepztwPxYEb0n72SMNZLTruz32JsEJNPAtcV9AcS9OpA6CoLrJGllXzW5relKtY2c8MBKWURnBdYZG_sNj7yg_JFo7cpdut4k1mzS

由于stm32的很多引脚都是复用,所以在配置寄存器配置时,必须设置为复用,复用切记是默认的复用功能为主,参考文档,请查看
http://download.csdn.net/detail/bolvtin/8867933

1、外设时钟寄存器
RCC_APB1ENR(APB1外设时钟使能寄存器)
RCC_APB2ENR(APB2外设时钟使能寄存器)

RCC_APB2RSTR(APB2外设复位寄存器)
RCC_APB1RSTR(APB1外设复位寄存器)

外设使能寄存器与外设复位寄存器存在着对应关系,相应位置对应相应外设的时钟使能与复位。

注意以下几个外设
1,GPIO--GPIOA,GPIOB, GPIOC,GPIOD,GPIOE,GPIOF,GPIOG时钟都在RCC_APB2ENR寄存器
2,串口--USART1时钟都在RCC_APB2ENR寄存器
3,定时器—TIM1,TIM8时钟都在RCC_APB2ENR寄存器

1,串口—USART2,USART3,USART4,USART5时钟都在RCC_APB1ENR寄存器
2,定时器—TIM2,TIM3,TIM4,TIM5,TIM6,TIM7时钟都在RCC_APB1ENR寄存器,TIM2- TIM5可以产生PWM

注意一下定时器的内部时钟信号来源
当APB1的时钟分频数设置为1,通用定时器的时钟就是APB1的时钟;当APB1的时钟分频数设置为2,通用定时器TIMx的时钟是APB1的2倍,即72Mhz。高级定时器1,8的时钟来自于APB2,不是APB1。

2、以PWM波为例进行说明

1,定时器2-5可以产生PWM波

timer.h  

  

#ifndef __TIMER_H  

#define __TIMER_H  

#include "sys.h"  

      

void Timerx_Init(u16 arr,u16 psc);  

void PWM_Init(u16 arr,u16 psc);  

#endif  

  

  

timer.c  

  

#include "timer.h"  

  

void PWM_Init(u16 arr,u16 psc)  

{                              

    //此部分需手动修改IO口设置  

    RCC->APB1ENR|=1<<1;       //TIM3时钟使能      

  

    GPIOA->CRH&=0XFFFFFFF0;//PA8输出  

    GPIOA->CRH|=0X00000004;//浮空输入  

  

/*********************serial code***************************************************************/         

    GPIOA->CRL&=0X0FFFFFFF;//PA7输出  

    GPIOA->CRL|=0XB0000000;//复用功能输出      

    GPIOA->ODR|=1<<7;//PA7上拉     

  

    TIM3->ARR=arr;//设定计数器自动重装值   

    TIM3->PSC=psc;//预分频器不分频  

      

    //TIM3->CCMR1|=7<<12;  //CH2 PWM2模式            这个作用在板子上的灯DS0可以显示PWM波  

    TIM3->CCMR1|=6<<12;  //CH2 PWM2模式  与上面极性相反    

    TIM3->CCMR1|=1<<11; //CH2预装载使能      

  

    TIM3->CCER|=1<<4;   //OC2 输出使能      

  

    TIM3->CR1=0x8000;   //ARPE使能   

    TIM3->CR1|=0x01;    //使能定时器3       

  

/*********************通用定时器4 1通道(PB6)和2通道(PB7)的配置***************************************************************/  

    RCC->APB1ENR|=1<<2;       //TIM4时钟使能      

    RCC->APB2ENR|=1<<3;//这里必须有这一个GPIO口的使能,GPIOA已经在led.c中定义过了,可是GPIO 的B口还没有  

                                    

    GPIOB->CRL&=0X00FFFFFF;//PB7 PB6输出  

    GPIOB->CRL|=0XBB000000;//复用功能输出    PB7的 TIM4的默认复用功能 为PWM波  

    GPIOB->ODR|=1<<7;//PB7上拉  

    GPIOB->ODR|=1<<6;//PB6上拉  

  

    TIM4->ARR=arr;//设定计数器自动重装值   

    TIM4->PSC=psc;//预分频器不分频  

      

    //TIM4->CCMR1|=7<<12;  //  

    TIM4->CCMR1|=6<<4;       //CH1 PWM2模式  

    TIM4->CCMR1|=6<<12;  //CH2 PWM2模式  

       

    TIM4->CCMR1|=1<<3;  //通道1预装载使能 是PB6口          

    TIM4->CCMR1|=1<<11; //CH2预装载使能  

      

    TIM4->CCER|=1<<0;   //通道1 输出使能  

    TIM4->CCER|=1<<4;   //OC2 输出使能  

             

  

    TIM4->CR1=0x8000;   //ARPE使能   

    TIM4->CR1|=0x01;    //使能定时器4   

                                                

}  

  

pwm.c  

  

#include  

#include "sys.h"  

#include "usart.h"        

#include "timer.h"  

  

void tim3PWM(int changeAngle)//俯仰舵机  

{     

    //PWM_Init(14400,100)定义了14400 对应20毫秒,720对应1毫秒,360对应0.5毫秒,电机的控制是0.5-2.5毫秒之间,1.5代表中位  

    TIM3->CCR2 = changeAngle;            //现在TIM3的2通道     TIM4的1通道 都可以用了 只需要改变这句 以及main函数中的//TIM4->CCR1 = 1080;即可  

    //TIM4->CCR1 = changeAngle;        

    //delay_ms(20);  

}  

  

void tim4PWM(int changeAngle)  

{     

    //TIM4->CCR1 = changeAngle;     不知道为什么总是出现1.5到2ms 再从2到1.5毫秒 跳变 貌似时钟不一样 改为tim4的2通道  

    TIM4->CCR2 = changeAngle;            //这个2通道 PB7口  

    //delay_ms(20);                      //根究DS0灯的PWM显示,貌似这里是不需要等待20毫秒的  

}  

  

int main(void)  

{     

/************************接收串口数据后,再发回,显示****** 

    Stm32_Clock_Init(9); //系统时钟设置 

    delay_init(72);      //延时初始化 

    uart_init(72,9600);  //串口初始化 串口1  串口2-5的时间晶振是不一样的 小一半  

     

    PWM_Init(14400,99);      //PWM频率是50hz  20ms对应的是14400 1ms对应720    TIM3_CH2->PA7 TIM4_CH2->PB7 

 

/************每次运行程序都进行中位初始化*************************/  

    TIM3->CCR2 = 1080; //1.5毫秒 中位     90度  

    TIM4->CCR1 = 1080; //1.5毫秒 中位     90度  

       

}  


关键字:STM32  PWM波  控制舵机 引用地址:STM32-PWM波-控制舵机

上一篇:STM32F103的时钟配置源码学习记录
下一篇:基于STM32F4的舵机控制

推荐阅读最新更新时间:2024-03-16 16:05

STM32的通用定时器的配置
STM32的通用定时器为:TIM2、TIM3、TIM4和TIM5 在使用通用定时器时利用库函数直接设置定时器如下: 1. 使能定时器TIM_X的时钟:(X=2、3、4、5) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMX,ENABLE); 2. 计算要定时的时间,根据定时时间来设定分频数和最大计数值(以向上计数为例子),其中计算关系如下: 系统时钟(一般为72MHZ) =定时器分频数 *计数值 假如分频数为7200,则定时器时钟为:72MHZ/7200=10KHZ,定时器每次计数时间间隔为1/10000秒,假如定时1秒,则要计数10000次,因此计数器的最大计数值为9999,
[单片机]
STM32软件复位的实现方法
前些天写程序的时候,需要做一个自动复位的功能,也就是当收到外部通讯设备复位指令时,主设备立刻执行复位操作。当时是想到的用看门狗实现。但是觉得似乎不太妥当,因为看门狗的复位是需要一定的时间。而在这段时间内系统还是处于正常运行当中,而且所有中断都会正常响应。这恰好与要实现的功能南辕北辙。需求是当收到复位指令时,系统停止执行后面的所有操作,包含中断响应。所以看门狗无法实现。 我用的是STM32F103芯片,了解这颗芯片能用来复位的只有5种,外部复位、独立/窗口看门狗、软件复位功耗管理。看来我能用的也就只有软件复位了。但是我查了所有STM32F103芯片相关的资料,还是没有找到具体的实现方法,最多是提到过这种复位寄存器SYSRESET
[单片机]
STM32系列芯片串口烧写工具
官方的FlashLoader使用着太过麻烦,一步一步下去,而且还不是每次都能顺利通过, 最近自己写了一个STM32系列芯片的串口烧写工具, 只需点一次烧写按钮,剩下的自动完成, 运行环境:.NET4.0 1.可以烧写最多5个程序+1个自定义的hex数据; 2.可以读取芯片信息; 3.可以读取芯片内容; 4.烧写选项可选读写校验, 整片擦除, 使能读保护, 循环烧写(烧写完会继续进行下一次的烧写, 方便生产); 应用截图 : 目前主流的STM32系列芯片都支持, 在MAP目录下可自定义扩展芯片配置文件; 版本更新 1.0.6 1.修复F0芯片获取资料不准确的BUG; 2.烧写过程中读取校验失败再多读取校验
[单片机]
<font color='red'>STM32</font>系列芯片串口烧写工具
STM32 M0时钟配置
本文主要讲STM32 M0的时钟配置。 先来看看M0内核的时钟树(stm32f072) 图中可以看出,M0芯片的时钟源有4个,一个高速内部RC时钟源,频率为8M;一个高速外部时钟源,频率为8到32MHz;一个低速外部时钟源,频率一般为32.768kHz;一个低速内部时钟源,频率为40kHz; 一、HSI 芯片上电的时候默认启用内部RC震荡,即8MHz的内部时钟源,如果对时钟要求不是特尔高的时候,使用内部时钟也够了,省下一个外部晶振的钱。 下面首先说说使用内部时钟的配置,官方提供的demo默认的就是使用内部时钟的,我们先从时钟树分析,HSI(8MHz)启动,经过PLLSRC(锁相环时钟源选择寄存器),然后来到PREDIV(预分频
[单片机]
STM32学习笔记之DMA传输
一、DMA简介 1、DMA简介 DMA(Direct Memory Access:直接内存存取)是一种可以大大减轻 CPU 工作量的数据转移方式。 CPU有转移数据、计算、控制程序转移等很多功能,但其实转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,再加上一些控制转移的部件就可以完成数据的拷贝。 DMA就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题。有了DMA使CPU更专注于更加实用的操作–计算、控制等。 2、DMA的工作原理 DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要
[单片机]
<font color='red'>STM32</font>学习笔记之DMA传输
STM32上移植FreeRTOS
首先在网上看到大部分移植FreeRTOS 都是选择修改他的启动文件,我个人感觉这样不是很好,毕竟是汇编,当你采用不同的芯片型号时,又要修改不同的xx.S文件,所以我选择修改FreeRTOSconfig.h文件。 1. 下载STM32官方源码:我的是基于V3.5的官方库(有工程模板的可以不用)。 下载FreeRTOS的源码 http://download.csdn.net/detail/jb8154989/6033207 2. 搭建好一个MDK的工程,我这里采用的是野火的工 程, http://download.csdn.net/my/uploads 3. 在工程模板目录下新建一个FreeRTOS文件夹,在FreeRTOS文件夹
[单片机]
<font color='red'>STM32</font>上移植FreeRTOS
新建基于MDK的STM32工程模板
一。开发环境和固定库版本 二。准备工作 三。建立工程模板 1. 建立一个Template的文件夹 2.在Template文件夹下建立下面3个文件夹 CORE 用来存放核心文件和启动文件, OBJ 是用来存放编译过程文件以及 hex 文件, STM32F10x_FWLib 文件夹顾名思义用来存放 ST 官方提供的库函数源码文件。USER 目录除了用来放工程文件外,还用来存放主函数文件 main.c,以及其他包括 system_stm32f10x.c 等等。 3. 在STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver 下面,将目录下
[单片机]
新建基于MDK的<font color='red'>STM32</font>工程模板
STM32定时器时钟 36M和72M迷糊的问题
(昵称和头像已经过处理) 这个问题,有很多人问到过。关于STM32定时器的时钟,TIM2使用APB1的时钟,APB1的时钟分明是36M,到了TIM2为什么就是72M了? 来来来,不要把问题想的太复杂,关于这个问题,我们看STM32的时钟图,有必要的话,你可以把时钟图打印出来贴到墙上每天看,见多了就熟悉了。 (我截取了时钟图的一部分) 看第一个圆圈内容,APB1的时钟,最大是36M,由分频系数决定,当分频系数是2的时候,APB1的时钟就是36MHz。 看第二个圆圈内容,当APB1的分频系数不为1的时候,TIMXCLK的时钟就是APB1的时钟乘以2。所以TIM2的时钟就是72MHz了。 为什么可以乘以2?答:手册上就是这么说的
[单片机]
<font color='red'>STM32</font>定时器时钟 36M和72M迷糊的问题
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved