您的位置:首页 > 其它

STM32-PWM波-控制舵机

2015-07-04 13:44 441 查看
寄存器配置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 <stm32f10x_lib.h>
#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度

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: