主函数:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "timer.h"
#include "pwm.h"
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
LED_Init(); //初始化与LED连接的硬件接口
TIM3_PWM_Init(899,0); //不分频。PWM频率=72000/(899+1)=80Khz
//TIM3_Int_Init(4999,7199); //10Khz=2*(36MHZ)/(7199+1)的计数频率,计数到5000为500ms(括号前面一个数就是设置计数次数的)
while(1)
{
//LED0=!LED0;
//delay_ms(500);
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>300) dir=0;
if(led0pwmval==0) dir=1;
TIM_SetCompare3(TIM3,led0pwmval);
}
}
pwm.c
#include "pwm.h"
#include "led.h"
//PWM输出初始化
//arr :自动重装载值
//psc: 时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); // ① 使能GPIO外设时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); // ① 使能TIM3的时钟
// GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH3->PB0
//,输出TIM3 _CH3的PWM脉冲波形
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //TIM3 _CH3
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //输出频率
GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化GPIOB.0
TIM_TimeBaseInitStructure.TIM_Period=arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //设置用来作为TIMx时钟频率消除的预分频值 不分频
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //设置时钟分割:TDTS=Tck_tim
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); // ② 初始化 TIM3
//这里,使用的是通道3,
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; //脉宽调制模式2
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; //输出极性高
TIM_OC3Init(TIM3,&TIM_OCInitStructure); // ③ 初始化外设 TIM3
TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable); // CH3预装载使能
//TIM_ARRPreloadConfig(TIM3,ENABLE); // 使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM3,ENABLE); //④ 使能TIM3寄存器
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
你好,我看了一下你的程序,请教一下那个TIM3的CH3通道通过PB0通道输出PWM,需要用到端口复用吗?
这个观察PB0管脚的占空比是否变化只能通过示波器来看嘛?能不能通过KEIL5里面自带的软件仿真功能来观察呀?
可以,但是没示波器直接看直观
示波器的两个管脚一个接PB0另外一个接哪里呀?
还有就是如果软件观察的话,是观察PB0的bit位还是state还是analog呀?
一周热门 更多>