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波
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度 }
相关文章推荐
- shell学习三十七天----引用
- 通过 IDE 向 Storm 集群远程提交 topology
- js实现复制一段文字的功能
- qt界面叠加视频OSD双层显示
- Looksery Cup 2015 A B D G H
- JAVA解析逻辑表达
- 自定制代码段
- 如何使你的Ajax应用内容可让搜索引擎爬行
- 试试markdown
- Hash算法
- js- 引用和复制(传值和传址)
- Dynamics CRM 2015 Update 1 系列(4): 自定义主键 - Alternate Keys
- 嵌入式 串口服务器
- CXGRID 定位行,列,取值
- c#上传文件(一)使用 .net 控件上传文件
- 队列的链式存储---链表实现(有头结点)
- linux中fork()函数详解
- JAVA JSON 开发记录
- POJ之路13-POJ2388
- chown与chomd区别