OpenEdv-开源电子网

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

想用pwm控制呼吸灯,但设置完成后常亮

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2020-11-11
在线时间
3 小时
发表于 2020-12-25 02:33:16 | 显示全部楼层 |阅读模式
3金钱
*******头文件*************************
#ifndef __BLN__H
#define __BLN__H
#include "stm32f10x.h"

void TIM2_PWM_init(u16 arr,u16 psc);
void BLN(void);

#endif
*******.c文件****************************
#include<C:\Users\86156\Desktop\新建工程模板\HARDWEAR\BLN.h>

void TIM2_PWM_init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_OCInitTypeDef TIM_OCInitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //使能GPIO和复用时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                            //端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;          //复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
  GPIO_Init(GPIOA, &GPIO_InitStructure);       
       
        TIM_TimeBaseStructure.TIM_Period = arr;   //设置自动重装载值 arr  
  TIM_TimeBaseStructure.TIM_Prescaler = psc;  //设置预分频值 psc (0不分频)
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //向上计数模式
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;  //设置时钟分割:TDTS = Tck_tim
  TIM_TimeBaseInit(TIM2 , &TIM_TimeBaseStructure);
       
        //TIM2-CH1 PWM设定
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;  //定时器输出值小于比较值,低电平有效  led为低电平有效
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0; //总脉宽  
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC1Init(TIM2, &TIM_OCInitStructure);
       
        TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
       
        TIM_Cmd(TIM2 , ENABLE);
}
*******主函数**********************************
void BLN(void)
{
        u16 pwm0=1;   //作比较值,在0~300循环增减
        u16 t0=0;   //控制增减,t0=0控制递增过程,t0=1控制递减过程
        while(1)
        {
                if(t0==0&&pwm0<300)
                        pwm0++;
                if(t0==0&&pwm0==300)
                        t0=1;
                if(t0==1&&pwm0>0)
                        pwm0--;
                if(t0==1&&pwm0==0)
                        t0=0;
                TIM_SetCompare1(TIM2,pwm0);
        }
}



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

使用道具 举报

2

主题

141

帖子

0

精华

高级会员

Rank: 4

积分
679
金钱
679
注册时间
2020-11-21
在线时间
67 小时
发表于 2020-12-25 13:20:04 | 显示全部楼层
占空比范围太小了,把占空比设置为0--100%,就能看到效果。
回复

使用道具 举报

20

主题

99

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2020-6-21
在线时间
70 小时
发表于 2020-12-25 13:41:19 | 显示全部楼层
PWM实验——呼吸灯.zip (1.03 MB, 下载次数: 51)
回复

使用道具 举报

1

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2020-11-7
在线时间
44 小时
发表于 2020-12-25 15:25:21 | 显示全部楼层
本帖最后由 游走在01的海洋 于 2020-12-25 15:33 编辑

你这应该是没有延时的作用,TIM_SetCompare1(TIM2,pwm0);加一句delay_ms(10);原因:你的psc不分频,按照stm32F103系列APB1在定时器这里应该是72Mhz,你的重装载寄存器就算使用最大值0xffff(65535)次,一秒内可以翻转72M/(65535+1)=1098.6次,频率快;所以如果你没有在主函数种设置延时函数,你设置的比较捕获寄存器值是同样的道理,肉眼基本看不到现象,需要一个让PWM输出的时间,也就是延时。
回复

使用道具 举报

1

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2020-11-7
在线时间
44 小时
发表于 2020-12-25 15:47:40 | 显示全部楼层
另外,你在设置输入捕获比较寄存器的值时,也要考虑自动重装载寄存器的值。
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2020-11-11
在线时间
3 小时
 楼主| 发表于 2020-12-25 18:43:15 | 显示全部楼层
游走在01的海洋 发表于 2020-12-25 15:25
你这应该是没有延时的作用,TIM_SetCompare1(TIM2,pwm0);加一句delay_ms(10);原因:你的psc不分频,按照stm ...

我在while循环里添加了延时,可是烧录后还是常亮
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2020-11-11
在线时间
3 小时
 楼主| 发表于 2020-12-25 18:47:53 | 显示全部楼层
游走在01的海洋 发表于 2020-12-25 15:25
你这应该是没有延时的作用,TIM_SetCompare1(TIM2,pwm0);加一句delay_ms(10);原因:你的psc不分频,按照stm ...

刚才我试着将延时调到1000,发现有一次闪烁,然后又保持常亮
回复

使用道具 举报

1

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2020-11-7
在线时间
44 小时
发表于 2020-12-25 22:15:49 | 显示全部楼层
王富贵丷 发表于 2020-12-25 18:47
刚才我试着将延时调到1000,发现有一次闪烁,然后又保持常亮

将自动重装置值arr设置在1000,再添加上延时delay_ms(10);试试
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 21:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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