OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5307|回复: 4

PWM输出实验 出现了问题 请教各位大佬

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2021-8-3
在线时间
3 小时
发表于 2021-9-9 23:13:12 | 显示全部楼层 |阅读模式
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"

TIM_HandleTypeDef TIM3_PWM_handler;
TIM_OC_InitTypeDef TIM3_OC_init;

void TIM3_PWM_Init(void)
{
        TIM3_PWM_handler.Instance=TIM3;
        TIM3_PWM_handler.Init.Prescaler=90-1;
        TIM3_PWM_handler.Init.CounterMode=TIM_COUNTERMODE_UP;
        TIM3_PWM_handler.Init.Period=500-1; //周期
       
        TIM3_OC_init.OCMode=TIM_OCMODE_PWM1;
        TIM3_OC_init.Pulse=250; //占空比
        TIM3_OC_init.OCPolarity=TIM_OCPOLARITY_LOW;
       
         HAL_TIM_PWM_Init(&TIM3_PWM_handler);
         HAL_TIM_PWM_ConfigChannel(&TIM3_PWM_handler,&TIM3_OC_init,TIM_CHANNEL_4);
       
        HAL_TIM_PWM_Start(&TIM3_PWM_handler,TIM_CHANNEL_4); //使能定时器,通道
       
}

void SETTIM3compare4(u32 compare)
{
        TIM3->CCR4=compare;
}

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) //回调函数
{
        if(htim->Instance==TIM3)
        {
                        GPIO_InitTypeDef GPIO_Initure;
               
                   __HAL_RCC_TIM3_CLK_ENABLE(); //使能定时器时钟
                   __HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOB时钟
               
                       
                        GPIO_Initure.Pin=GPIO_PIN_1;                        //PB1
                        GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //复用推挽输出
                        GPIO_Initure.Pull=GPIO_PULLUP;                        //上拉
                        GPIO_Initure.Speed=GPIO_SPEED_FAST;                //高速
                        GPIO_Initure.Alternate= GPIO_AF2_TIM3;        //复用为TIM3
                        HAL_GPIO_Init(GPIOB,&GPIO_Initure);                   //初始化PB1
        }
}

int main(void)
{
    u8 dir=1;
        u16 ledpwmvalue=0;
       
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
    LED_Init();                     //初始化LED
    KEY_Init();                //初始化按键
       
        TIM3_PWM_Init();
       
    while(1)
    {
                if(dir)ledpwmvalue++;
                else ledpwmvalue--;
               
                if(ledpwmvalue>300)dir=0; //改变方向
                if(ledpwmvalue==0)dir=1;
               
                SETTIM3compare4(ledpwmvalue);
               
    }
       
}

为啥这代码没有实现led0由暗到亮再到暗的功能啊 一直是常亮的

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3391

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8655
金钱
8655
注册时间
2020-5-11
在线时间
4115 小时
发表于 2021-9-10 10:02:02 | 显示全部楼层
占空比多久改变一次?
专治疑难杂症
回复 支持 反对

使用道具 举报

3

主题

117

帖子

0

精华

高级会员

Rank: 4

积分
559
金钱
559
注册时间
2018-10-3
在线时间
107 小时
发表于 2021-9-10 10:21:39 | 显示全部楼层
占空比变化太快吧。while(1)里随便加一个延时试试看。
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2021-8-3
在线时间
3 小时
 楼主| 发表于 2021-9-10 10:39:36 | 显示全部楼层
对了,谢谢!
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2021-8-3
在线时间
3 小时
 楼主| 发表于 2021-9-10 10:40:28 | 显示全部楼层
LcwSwust 发表于 2021-9-10 10:02
占空比多久改变一次?

加了延时好了,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-2 20:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表