STM32 自定义频率与占空比PWM输出的方法

图一

图二

PWM应用非常广泛,但是不同的项目对输出的PWM又有特殊要求,为满足这些要求我们需要更多的实验来验证。接下来讲述图一显示波形的输出方法步骤(图二为异常波形)。

一、本实例所使用资源:

1、TIM4_CH3(对应管脚PB8)用于输出PWM波形

2、TIM3用于产生中断

3、MDK 软件仿真方法

二、执行过程:

1、初始化配置TIM4_CH3对应管脚的PWM输出功能(频率与占空比可变)。

2、初始化配置使用TIM3定时器中断功能,中断时间的配置需要根据PWM输出波形配置(定时器中断时间可变)。

3、在main()函数中调用TIM4与TIM3的初始化函数。

三、具体代码:

int main(void) //主函数
 {
delay_init();     //延时函数初始化
uart_init(9600);  //串口初始化
TIM4_PWM_Init(999,7199); //TIM4 PWM输出初始化
TIM3_Interrupt_Init(999,7199); //TIM3定时器中断初始化

pwmval= 600;   //占空比
 
   while(1) ;
}



void TIM4_PWM_Init(u16 arr,u16 psc) //TIM4 定时器PWM输出功能初始化函数
{  
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);//使能GPIO外设和AFIO复用功能模块时钟使能
                                                                         
GPIO_InitStructure.GPIO_Pin = /*GPIO_Pin_6 | GPIO_Pin_7|*/GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);


TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //正向通道有效
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; //反向通道无效
TIM_OCInitStructure.TIM_Pulse = 0; //占空时间

// TIM_OC1Init(TIM4,&TIM_OCInitStructure);        //通道1
// TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
// TIM_OC2Init(TIM4,&TIM_OCInitStructure);        //通道2
// TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC3Init(TIM4, &TIM_OCInitStructure); //使能通道3
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC4Init(TIM4, &TIM_OCInitStructure); //使能通道4
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);


TIM_CtrlPWMOutputs(TIM4,ENABLE);


TIM_ARRPreloadConfig(TIM4, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM4, ENABLE); //使能TIMx外设
}


void TIM3_Interrupt_Init(u16 arr,u16 psc) //TIM3定时器中断功能初始化函数
{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
  
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
TIM_ITConfig(TIM3,TIM_IT_Update | TIM_IT_Trigger,ENABLE);


NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //相应优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器


TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}


void TIM3_IRQHandler(void) //TIM3中断服务函数
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
{
++Event;
if(Event == 1)
{
TIM_SetCompare3(TIM4,(led0pwmval*80)/100);
}
if(Event == 2)
{
Event = 0;

TIM_SetCompare3(TIM4,(led0pwmval*20)/100);
}


TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源 
}
}


调试方法:PWM频率和占空比的修改最好是通过中断来实现,即用一个定时器定时产生中断,在中断服务函数中修改PWM输出频率与占空比。

  如果想输出“图一”PWM波形,只能通过定时器中断的方法完成,而且定时器中断频率必须与PWM输出频率一致才能输出“图一”所示波形



  • 8
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: STM32F103系列MCU是一款广泛使用的多功能微控制器,可以用于各种应用,包括输出PWM(Pulse Width Modulation)信号。 在STM32F103上配置输出PWM信号需要以下步骤: 1. 首先,需要选择一个可用的GPIO引脚作为PWM输出引脚,并将其配置为复用推挽输出模式。可以使用GPIO_Init函数进行配置,设置引脚的模式、速度以及复用输出功能。 2. 对于PWM信号的生成,需要使用定时器。STM32F103系列MCU通常有多个定时器可供选择。选择一个可用的定时器,并配置定时器的时钟频率、计数方式以及自动重载值。 3. 配置定时器的PWM模式。可以使用TIM_OCInitTypeDef结构体对定时器的输出比较通道进行配置,设置通道的工作模式、极性和脉冲宽度。 4. 最后,启动定时器并使能PWM输出。通过调用相关函数,如TIM_Cmd()函数以启动定时器,使TIM_CtrlPWMOutputs()函数以使能PWM输出。 以上步骤主要介绍了在STM32F103上输出PWM信号的基本配置。但是具体的配置过程可能会因具体的开发板和库函数有所不同。因此,在具体实现PWM输出之前,建议参考官方文档和相关的例程来获取更多详细信息和操作方法。 总结:通过选择GPIO引脚、配置定时器和输出比较通道等步骤,我们可以在STM32F103上实现PWM信号的输出,从而实现各种应用需求,如驱动电机、控制灯光亮度等。 ### 回答2: STM32F103系列微控制器具有丰富的外设和强大的计时器功能,可以方便地实现PWM输出。下面是使用STM32CubeIDE进行配置的步骤: 1. 打开STM32CubeIDE,创建一个新的工程,并选择适当的STM32F103芯片型号。 2. 在“Pinout & Configuration”选项卡中,选择一个可用的GPIO引脚作为PWM输出的引脚。 3. 在“Configuration”选项卡中,启用相应的定时器和PWM输出。 4. 在“Peripherals”选项卡中,配置所选定时器的工作模式为PWM模式,并设置PWM频率占空比。 5. 在“Project”选项卡中,生成代码。 6. 在生成的代码中,找到并编辑“main.c”文件。 7. 在“main.c”文件中,找到定时器初始化的部分,并根据需要进行自定义。 8. 在“main.c”文件中,找到定时器中断处理函数,并编写PWM输出的相关代码。例如,可以使用“PWM波的占空比增加”方法来实现占空比逐渐增大的效果。 9. 编译和烧录生成的代码到实际的STM32F103开发板上。 10. 运行程序,你将能够看到PWM信号在你所选择的引脚上输出。 这些步骤只是粗略描述了如何在STM32F103上实现PWM输出。实际操作时,有可能需要更详细的配置和代码编写。因此,建议参考STM32F103的参考手册和相关的开发文档,以获得更全面的指导。 ### 回答3: STM32F103是一款具有PWM输出功能的单片机。在使用PWM输出之前,首先需要进行相应的配置。 首先,我们需要将GPIO引脚配置为PWM输出模式。可以通过设置相应的寄存器来实现。例如,如果我们要将PA1引脚配置为PWM输出,则需要将GPIOA的CRH寄存器的相应位设置为对应的值,以选择输出PWM信号。 其次,我们需要配置PWM输出频率占空比。可以通过设置定时器的寄存器来实现。例如,如果我们要以1kHz的频率输出PWM信号,并且占空比为50%,则需要选择适当的定时器,并设置ARR寄存器的值为适当的数值,以获得所需的频率。另外,还需要设置CCRx寄存器的值来设置占空比。 最后,我们需要启动定时器以开始生成PWM信号。可以通过设置相应的控制寄存器来实现。例如,打开定时器使能位,启动定时器的计数功能。 在配置完毕后,系统会自动根据设置好的频率占空比生成相应的PWM信号。可以通过GPIO引脚连接外部设备,如LED或电机,来实现不同的功能。 总结起来,要在STM32F103上实现PWM输出,需要进行GPIO引脚的配置、定时器的配置和启动等步骤。这样,我们就可以利用STM32F103的PWM输出功能来控制外部设备的状态。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值