2401_84236995 2024-04-17 10:14 采纳率: 0%
浏览 8

32单片机pwm模式无论调1还是2都只输出高电平有效波形

include "stm32f10x.h" // Device headervoid PWM_Init(uint16_t arr,uint16_t psc){//PB0 TMI3 CH3 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //打开时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//PB0 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); TIM_InternalClockConfig(TIM3); //选择内部时钟 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //初始化时基单元 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Period = arr-1; //周期ARR TIM_TimeBaseInitStructure.TIM_Prescaler = psc-1; //预分频器PSC TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCStructInit(&TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//模式二低电平有效输出 TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; //CCR的值 TIM_OC3Init(TIM3,&TIM_OCInitStructure); TIM_Cmd(TIM3,ENABLE); //启动定时器 }void PWM_SetCompare3(uint16_t speed){//比较输出 TIM_SetCompare3(TIM3,speed); }
配置了pwm2,比较输出时还是输出高电平有效波形

img

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-17 10:14
    关注

    引自免费微信小程序:皆我百晓生

    看起来你在配置STM32F10x微控制器上的TIM3(Timer 3)作为PWM输出,但是你遇到了一个问题:尽管你设置了PWM模式为2,输出始终是高电平有效的。根据提供的信息,我可以确认你的设置大部分是正确的,但可能是在初始化结构体中的TIM_OCNPolarity参数上出了点小问题。

    在STM32中,对于PWM模式2(边缘对齐),TIM_OCNPolarity决定了上升沿或下降沿触发占空比变化。对于低电平有效输出,你应该将这个参数设置为TIM_OCPolarity_Low,而不是TIM_OCPolarity_High。请看下面修改后的代码片段:

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; // 模式二低电平有效输出
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_Low; // 修改这里为TIM_OCPolarity_Low
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0; // CCR的值
    TIM_OC3Init(TIM3, &TIM_OCInitStructure);
    

    这段代码更改了TIM_OCNPolarityTIM_OCPolarity_Low,这将使PWM输出在比较值达到时变为低电平,而不是高电平。这样应该能解决你的问题,使得PWM输出符合预期的低电平有效波形。

    确保在调用PWM_Init函数后,通过PWM_SetCompare3设置合适的脉冲宽度,以产生你需要的波形。例如,如果你想让PWM信号在每个周期中有50%的时间为低电平,你可以这样做:

    uint16_t period = 1000; // 假设你的PWM频率为1kHz,所以周期为1ms
    uint16_t pulse_width = period / 2; // 对于50%占空比,脉冲宽度应为500
    
    PWM_Init(period, 72); // 假设系统时钟为72MHz,所以psc为72
    PWM_SetCompare3(pulse_width);
    

    这段代码会设置一个50%占空比的PWM波形,如果你的时钟速度或期望的PWM频率不同,请相应地调整periodpsc参数。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月17日

悬赏问题

  • ¥15 angular项目错误
  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件