STM32F103输出比较(OC)与PWM的调制步骤

1、输出比较的理解

1-1、PWM模式1

向上计数输出比较,可以理解为REF与RCC正比,CRR大就是有效电平。CRR小就是无效电平。

向下计数输出比较,可以理解为REF与CRR正比,CRR大就是有效电平。CRR小就是无效电平。

1-2PWM模式2

向上计数输出比较,可以理解为REF与RCC正比,CRR大就是无效电平。CRR小就是有效电平。

向下计数输出比较,可以理解为REF与CRR正比,CRR大就是无效电平。CRR小就是有效电平。

2、时基单元部分与TIM部分相同,只需要修改一些就可以拿来使用。

占空比由CRR、CNT、PSC这几个因素共同决定,分别代表下面几个函数,其实就是跟中断差不多,不用配置初始化NVIC,NVIC换成初始化OC。

    TIM_timeBaseInitStructure.TIM_Period=100-1;                    //(ARR)周期,自动重装
    TIM_timeBaseInitStructure.TIM_Prescaler=720-1;                        //(PSC)预分频器

    TIM_OCInitStructure.TIM_Pulse=0;                                //CCR复位时钟控制

3.1代码部分,这个是用来控制LED呼吸灯的

	TIM_OCInitStructure.TIM_Pulse=0;								//CCR复位时钟控制
void Set_Compare(uint16_t compare)
{
    TIM_SetCompare1(TIM2,compare);
}

 上面这个函数其实就是相当于是间接配置占空比了,TIM_SetCompare1(TIM,compare);其实就是  传递  TIM_OCInitStructure.TIM_Pulse=0;                                //CCR复位时钟控制     的值。只要在主函数里面调用这个函数就可以改变占空比了。

#include "stm32f10x.h"                  // Device header


void PWM_OCInit(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);      //开启GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	TIM_InternalClockConfig(TIM2);                           //内部时钟模式
	
//	TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x00);  //外部时钟模式
	

	TIM_TimeBaseInitTypeDef TIM_timeBaseInitStructure;
	TIM_timeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;   //时钟分频 1, 2, 4
	TIM_timeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;  //计数器模式
	TIM_timeBaseInitStructure.TIM_Period=100-1;					//(ARR)周期,自动重装
	TIM_timeBaseInitStructure.TIM_Prescaler=720-1;						//(PSC)预分频器
	TIM_timeBaseInitStructure.TIM_RepetitionCounter=0;				//高级计数器
	TIM_TimeBaseInit(TIM2,&TIM_timeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=0;								//CCR复位时钟控制
	TIM_OC1Init(TIM2,&TIM_OCInitStructure);
	
	TIM_Cmd(TIM2,ENABLE); 	
}

void Set_Compare(uint16_t compare)
{
	TIM_SetCompare1(TIM2,compare);
}


uint8_t i;
int main(void)
{
	
	PWM_OCInit();
	while(1)
	{	
		for(i=0;i<100;i++)
		{
			Set_Compare(i);
			Delay_ms(40);
		}
		for(i=0;i<100;i++)
		{
			Set_Compare(100-i);
			Delay_ms(40);
		}
	}
}

3.2这个是控制舵机的

#include "stm32f10x.h"                  // Device header


void PWM_OCInit(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);      //开启GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	TIM_InternalClockConfig(TIM2);                           //内部时钟模式
	
//	TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x00);  //外部时钟模式
	

	TIM_TimeBaseInitTypeDef TIM_timeBaseInitStructure;
	TIM_timeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;   //时钟分频 1, 2, 4
	TIM_timeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;  //计数器模式
	TIM_timeBaseInitStructure.TIM_Period=20000-1;					//(ARR)周期,自动重装
	TIM_timeBaseInitStructure.TIM_Prescaler=72-1;						//(PSC)预分频器
	TIM_timeBaseInitStructure.TIM_RepetitionCounter=0;				//高级计数器
	TIM_TimeBaseInit(TIM2,&TIM_timeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=0;
	TIM_OC2Init(TIM2,&TIM_OCInitStructure);
	
	TIM_Cmd(TIM2,ENABLE); 	
}

void Set_Compare(uint16_t compare)
{
	TIM_SetCompare2(TIM2,compare);
}

uint8_t Keynum;
float Angle;
int main(void)
{
	Key_Init();
	SOVER_Init();
	
	while(1)
	{	
		Keynum=Key_GetNum();
		if(Keynum==1)
		{
			Angle+=30;
			if(Angle>180)
			{
				Angle=0;
			}
		}
		
		SOVER_Compare(Angle);
	}
}

3.3这个是控制直流电机的

#include "stm32f10x.h"                  // Device header


void PWM_OC3Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);      //开启GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	TIM_InternalClockConfig(TIM2);                           //内部时钟模式
	
//	TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x00);  //外部时钟模式
	

	TIM_TimeBaseInitTypeDef TIM_timeBaseInitStructure;
	TIM_timeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;   //时钟分频 1, 2, 4
	TIM_timeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;  //计数器模式
	TIM_timeBaseInitStructure.TIM_Period=100-1;					//(ARR)周期,自动重装
	TIM_timeBaseInitStructure.TIM_Prescaler=36-1;						//(PSC)预分频器
	TIM_timeBaseInitStructure.TIM_RepetitionCounter=0;				//高级计数器
	TIM_TimeBaseInit(TIM2,&TIM_timeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=0;
	TIM_OC3Init(TIM2,&TIM_OCInitStructure);
	
	TIM_Cmd(TIM2,ENABLE); 	
}

void Set_Compare3(uint16_t compare)
{
	TIM_SetCompare3(TIM2,compare);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值