专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

STM32自带PWM输出实验

作者:佚名   来源:本站原创   点击数:  更新时间:2013年10月21日   【字体:
#include <stm32f10x_lib.h>
#include "sys.h"
#include "delay.h"
#include "usart.h"

#define LED0_val TIM3->CCR2

 
void PWM_init(u16 arr,u16 psc)
{
  RCC->APB1ENR|=1<<1;                 //TIM3时钟使能 
  GPIOA->CRH&=0xfffffff0;                //PA8
  GPIOA->CRH|=0x00000004;          //PA8   浮空输入
  GPIOA->CRL&=0x0fffffff;               
  GPIOA->CRL|=0xB0000000;         //PA7复用输出
  GPIOA->ODR|=1<<7;                     //PA7上啦
  TIM3->ARR=arr;                            //设置重装载值
  TIM3->PSC=psc;                            //设置预分频系数
  TIM3->CCMR1|=7<<12;                 //CH2  PWM2模式
  TIM3->CCMR1|=1<<11;                //CH2预装载使能
  TIM3->CCER|=1<<4;                     //OC2输出使能
  TIM3->CR1|=0x0080;                      //ARPE使能
  TIM3->CR1|=0x01;                       //使能定时器3
}

int main(void)
{
 u16 pwm=0;
 u8 dir=1;
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
PWM_init(900,0);                   //频率72000/900    80KHZ

while(1)
{
delay_ms(10);
if(dir)pwm++;
else pwm--;
if(pwm>300)dir=0;
if(pwm==0)dir=1;
LED0_val=pwm;
}
}


void PWM_init(u16 arr,u16 psc)函数解析:
 GPIOA->CRL&=0x0fffffff;
 GPIOA->CRL|=0xB0000000;    //PA7复用输出   因为TIM3_CH2 通道是I/O口复用的形式连接到PA7上的
TIM3->ARR;                     //设置自动重装载值
TIM3->PSC;                   //设置分频系数
TIM3->CCMR1|=7<<12;          //CH2  PWM2模式
                                                  CCMR1用于控制CH1 和CH2通道






由于7=0x111;

所以OC1M[2:0]为

111:PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
默认为高电平有效 


计数模式是  TIM3_CR1 中 位4决定
                        位4                      0:计数器向上计数; 1:计数器向下计数。 
 默认为向上计数模式
定时器的值从0-----> TIM->ARR  到自动装载值 循环变化 
//---------------------------------------------------------------------------------------
  TIM3->CCMR1|=1<<11;                //CH2预装载使能
  TIM3->CCER|=1<<4;                     //OC2输出使能

 
 
 CC2E:输入/捕获1输出使能 (Capture/Compare 1 output enable)
 CC2通道配置为输出: 0: 关闭- OC1禁止输出。 1: 开启- OC2信号输出到对应的输出引脚。
CC2通道配置为输入: 该位决定了计数器的值是否能捕获入TIMx_CCR1寄存器。 0:捕获禁止; 0:捕获使能。

 
 TIM3->CR1|=0x0080;                      //ARPE使能

ARPE:自动重装载预装载允许位 (Auto-reload preload enable)
 0:TIMx_ARR寄存器没有缓冲; 1:TIMx_ARR寄存器被装入缓冲器。 

// 

 

还有一篇我发布的是定时器产生的pwm: http://www.51hei.com/mcu/2125.html

关闭窗口

相关文章