采用TIM1高级定时器产生PWM

简介

STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和 TIME7 等基本定时器。而每种定时器的使用方法略有不同,之前写产生pwm的程序使用的都是通用定时器,今天使用高级定时器TIM1时发现怎么也产生不了,后来才知道使用TIM1时,需要多添加两行代码

//重复计数器的值
 TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
// 主输出使能,当使用的是通用定时器时,这句不需要
TIM_CtrlPWMOutputs(TIM1, ENABLE);

高级定时器TIM1的TIM1_TIM1BaseInitTypeDef结构体
在这里插入图片描述TIM1_RepetitionCounter是高级定时器特有的一个值,使用时需要对其进行初始化
在这里插入图片描述主输出使能,使用的是高级定时器时,需要添加这个函数
在这里插入图片描述

参考代码

控制GPIO PA8/PA11产生PWM来控制两个舵机
TIM1_CH1/TIM1_CH4
在这里插入图片描述

void TIM1_PWM_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;   //声明一个结构体变量,用来初始化GPIO

	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器

	TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx

	/* 开启时钟 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

	/*  配置GPIO的模式和IO口 */
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_Init(GPIOA,&GPIO_InitStructure);


	//TIM1定时器初始化
	TIM_TimeBaseInitStructure.TIM_Period = 199;//900;	   //不分频,PWM 频率=72000/900=8Khz//设置自动重装载寄存器周期的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;//0;//设置用来作为TIMx时钟频率预分频值,100Khz计数频率
	TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//TIM向上计数模式
	// 重复计数器的值,没用到不用管
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
    TIM_TimeBaseInit(TIM1, & TIM_TimeBaseInitStructure);
    
	//PWM初始化	  
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;

	TIM_OC1Init(TIM1,&TIM_OCInitStructure);
	TIM_OC4Init(TIM1,&TIM_OCInitStructure);
	//注意此处初始化时TIM_OC2Init而不是TIM_OCInit,否则会出错。因为固件库的版本不一样。

	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
	TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR2上的预装载寄存器
	
	TIM_Cmd(TIM1,ENABLE);//使能或者失能TIMx外设
	
	// 主输出使能,当使用的是通用定时器时,这句不需要
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
}

int main()
{
	TIM1_PWM_Init();
	while(1)
	{
		TIM_SetCompare1(TIM1, 195);//0度
		delay_ms(100);
		TIM_SetCompare1(TIM1, 190);//45度
		delay_ms(100);

		TIM_SetCompare4(TIM1, 195);//0度
		delay_ms(100);
		TIM_SetCompare4(TIM1, 190);//45度
		delay_ms(100);
	}
}
  • 18
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值