蓝桥杯_嵌入式:PWM_基础配置实验(库函数)


前言:

PWM的输出也是定时器的基本功能之一,

这里我们将使用GPIOA中的GPIO_Pin_7做为TIM3第二通道的PWM输出实验


代码部分:

1.pwm.h:

#ifndef __PWM_H
#define __PWM_H

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"


void TIM3_PWM_Init(u16 arr, u16 psc);


#endif 


2.pwm.c:

#include "pwm.h"


void TIM3_PWM_Init(u16 arr, u16 psc) //GPIOA_Pin_7   --TIM3-通道2
{
	GPIO_InitTypeDef GPIO_InitStruct;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_OCInitTypeDef TIM_OCInitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);    //使能GPIO外设时钟使能
	
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;       //TIM3_CH2
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct); 
	
	TIM_TimeBaseInitStruct.TIM_Period=arr;    //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
	TIM_TimeBaseInitStruct.TIM_Prescaler=psc;   //设置用来作为TIMx时钟频率除数的预分频值  不分频
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);   
	
	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;    //选择定时器模式:TIM脉冲宽度调制模式2
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;   //比较输出使能
	TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;    //输出极性:TIM输出比较极性高
	TIM_OCInitStruct.TIM_Pulse=0    ;//设置待装入的脉冲值
	TIM_OC2Init(TIM3,&TIM_OCInitStruct);    
	
	TIM_CtrlPWMOutputs(TIM3,ENABLE);  // 主输出使能	
	
	TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);       //CH2预装载使能	 
	TIM_ARRPreloadConfig(TIM3,ENABLE);                        //使能TIM3在ARR上的预装载寄存器
	TIM_Cmd(TIM3,ENABLE);                                    //使能TIM3
}


3.main.c:

#include "stm32f10x.h"
#include "lcd.h"
#include "led.h"
#include "key.h"
#include "pwm.h"
u32 TimingDelay = 0;

void Delay_Ms(u32 nTime);


int main(void)
{
	u16 PWM=0;
	u8 flag=1;
	SysTick_Config(SystemCoreClock/1000);
  STM3210B_LCD_Init();
	LCD_Clear(Green);
	LCD_SetBackColor(Black);//2
	LCD_SetTextColor(White);//3	
	
	TIM3_PWM_Init(899,0);
	while(1)
	{
		Delay_Ms(10);
		if(flag)  PWM++;
		else PWM--;
		
		if(PWM>300) flag=0;
		if(PWM==0)  flag=1;
		
		TIM_SetCompare2(TIM2,PWM);

	}
}


void Delay_Ms(u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}

如果要查看pwm输出效果,要使用杜邦线接LED插在PA7引脚上才能看到代码完成程度

注意:关于如何控制PWM的占空比,如此文章展示的代码TIM_SetCompare2(TIM2,PWM);中的第二个            入口参数就是我们控制PWM占空比的关键。

          TIM3_PWM_Init(899,0);中的第一个参数就是占空比的上限。

          若要控制占空比为30%,则需要为TIM_SetCompare2(TIM2,300);   

          和   TIM3_PWM_Init(999,0);

          计算原理为300/1000为30%


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值