单片机
返回首页

STM32的PWM波产生的问题总结

2018-06-28 来源:eefocus

使用的是STM32F103RC

问题:PWM占空比的计算结果是对的但是输出出现错误,对于新西达的电机没法解锁,原因是没理解寄存器的作用。


#include 'tim2_pwm.h'
#include 'stm32f10x_tim.h'
void Init_GPIO(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE);	
	//OC1_PBA0  OC2_PBA1  OC3_PBA2  OC4_PBA3
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3 ;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void Init_TIMER2(void)
{
	TIM_TimeBaseInitTypeDef	 TIM_BaseInitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	TIM_BaseInitStructure.TIM_Period = 3000-1;//自动冲装载寄存器
	TIM_BaseInitStructure.TIM_Prescaler = 72-1;//输出比较寄存器
	TIM_BaseInitStructure.TIM_ClockDivision = 0;
	TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM2, &TIM_BaseInitStructure);
 	
	TIM_ARRPreloadConfig(TIM2, ENABLE);
	TIM_Cmd(TIM2, ENABLE);
}
void Init_PWM(void)
{
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	//OC1
	TIM_OCInitStructure.TIM_Pulse = 0;
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);
	TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);
	//OC2
	TIM_OCInitStructure.TIM_Pulse = 0;
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);
	TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
	//OC3
	TIM_OCInitStructure.TIM_Pulse = 0;
	TIM_OC3Init(TIM2, &TIM_OCInitStructure);
	TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);
	//OC4
	TIM_OCInitStructure.TIM_Pulse = 0;
	TIM_OC4Init(TIM2, &TIM_OCInitStructure);
	TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Enable);
	
	TIM_CtrlPWMOutputs(TIM2,ENABLE);
}
///////////////////////////////////////
////////////////////////////////////////
void pwm(void)
{
	Init_TIMER2();
	Init_GPIO();
	Init_PWM();
}
empty


在代码片中的第20行的TIM_Period寄存器为自动重装载寄存器TIM_ARR的值,当计数器的值等于此值时定时器重新开始计数

在代码片中的第21行的TIM_Prescaler寄存器为预分频寄存器TIMx_PSC的值,是对于输入定时器的时钟进行分频

这两行的设置结果是PWM的输出频率为Fout=72000000/72/3000Hz;即输出的周期为3000us即3ms;

对于库函数:

TIM_SetCompare1(TIM2,999);

该函数中的999指的是高点平持续的计数数,其与TIM_Period寄存器的比值即为占空比。

则上述设置的高电平的持续时间为:1000*1us=1ms,满足新西达电机的解锁条件。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • CCD图像传感器在微光电视系统中的应用

  • 离子检测器电路分析

  • 非常简单的150W功放电路图

  • 一个简单的警笛电路图

  • 分享一个电网倾角计电路

  • 电谐波图形均衡器示意图

    相关电子头条文章