stm32 time4 pwm

pwm.h

#ifndef _PWM_H
#define _PWM_H
#include "sys.h"


void TIM14_PWM_Init(u32 arr,u32 psc);
#endif



pwm.c

#include "pwm.h"


//TIM4 PWM部份初始化
//PWM 输出初始化arr:自动重装值 psc:时钟预分频系数


void TIM14_PWM_Init(u32 arr,u32 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);//time14时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//TIME14在PF9上,使能gpioF


GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);//GPF9复用为tim14


GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //GPIOF9
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //复用
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; //高速
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //推挽复用
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化GPIOF9

TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //


TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure); //初始化定时器14

//初始化tim14 channel1 PWM模式
//PWM 调制模式1只要 TIMx_CNT < TIMx_CCR1,通道 1 便为有效状态,否则为无效状态。
//可以理解为 if TIMx_CNT < TIMx_CCR1 输出否则不输出 计数cnt<ccr1 
//ccr1为捕获/比较寄存器

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//输出极性低,因为PF9连接的LED0低电平才会亮
TIM_OC1Init(TIM14,&TIM_OCInitStructure); //初始化外设TIM1_40C1


TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable);//使能预装载寄存器

TIM_ARRPreloadConfig(TIM14,ENABLE);//CT1寄存器的位7 ARPE=1,这样ARR寄存器的内容在更新事件UEV发生时
//传送到影子寄存器


TIM_Cmd(TIM14,ENABLE);//使能tim14

}


main.c

#include "sys.h"
#include "delay.h"


#include "pwm.h"


int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//系统优先级分组2
delay_init(168);//168 MHz

TIM14_PWM_Init(500-1,84-1);//

//定时器的频率为84Mhz,分频系数为84,84000000/84=1Mhz 0.000001秒 1us;
//自动重装载值为500,定时器的周期=0.000001*500=0.0005s=500us=0.5ms,所以频率为1000ms/0.5ms=2khz
//定时器的频率为2Khz已经固定了
//
while(1)
{
delay_ms(10);
if(dir)
led0pwmval++;
else
led0pwmval--;
if(led0pwmval>300)dir=0; //3秒 到达300后,方向为递减
if(led0pwmval == 0)dir=1; //到达0后,方向为递增
TIM_SetCompare1(TIM14,led0pwmval); //修改比较值,修改占空比 此处修改CCR1为捕获/比较寄存器的值

}
}


/*
TIM_SetCompare1(TIM14,led0pwmval)每10ms设置了CCR1寄存器的值,
计算寄存器CNT的值为0~500这个不变(上面初始化时设了)  比较寄存器CCR1的值在变
通过前面设置只要CNT<CCR1,GPIOF9(tim14)就会输出低电平
在2khz也就是0.5ms内,如果CCR1为100,那么0.1ms的时间灯是亮的,如果CCR1=300,那么0.3ms灯是亮的
又led0pwmval从0-300然后双从300到0,所以灯的亮度也是从低到高然后再从高到低




*/



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值