OpenEdv-开源电子网

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

老哥们,我现在在做一个普通IO口模拟PWM输出控制LED的呼吸灯

[复制链接]

20

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-5-6
在线时间
43 小时
发表于 2020-11-7 14:22:12 | 显示全部楼层 |阅读模式
10金钱
老哥们,我现在在做一个普通IO口模拟PWM输出控制LED的呼吸灯,现在LED灯一直常亮,没找到具体的原因。求指点
u8 dir = 1;
u8 ledpwmval;
int ledpwmcount;
u8 timecount;
void TIM4_IRQHandler(void)//200us
{
        printf("TIM4.......\n");
        if(TIM_GetITStatus(TIM4,TIM_FLAG_Update))
        {
                if(++timecount > 100)
                {
                        timecount = 0;
                        if((dir==1)&&(ledpwmcount<=799))
                        {
                                ledpwmcount++;
                                if(ledpwmcount > 799)
                                {
                                        ledpwmcount =799;
                                        dir = 0;
                                }
                        }
                        if((dir==0)&&(ledpwmcount>0))
                        {
                                ledpwmcount--;
                                if(ledpwmcount == 0)
                                {
                                        ledpwmcount = 0;
                                        dir = 1;
                                }
                        }
                                ledpwmval = ledpwmcount;
                }
                if(ledpwmval>0)
                {
                  GPIO_ResetBits(GPIOC,LED0);
                  ledpwmval--;
                }
                else
                  GPIO_SetBits(GPIOC,LED0);
        }
        TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
}
定时器4部分

void TIM4_Int_Init(u16 arr,u16 psc)
{   
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
    NVIC_InitTypeDef NVIC_InitStructture;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);

    TIM_TimeBaseInitStrue.TIM_Period = arr;
    TIM_TimeBaseInitStrue.TIM_Prescaler = psc;
    TIM_TimeBaseInitStrue.TIM_CounterMode =TIM_CounterMode_Up;
    TIM_TimeBaseInitStrue.TIM_ClockDivision =0;
    TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStrue);  

    TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);

    NVIC_InitStructture.NVIC_IRQChannel = TIM4_IRQn;
    NVIC_InitStructture.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructture.NVIC_IRQChannelSubPriority = 3;
    NVIC_InitStructture.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructture);

    TIM_Cmd(TIM4,ENABLE);
}
void TIM4_PWM_Init(u16 arr,u16 psc)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
    TIM_OCInitTypeDef TIM_OCInitTypeStrue;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);

    GPIO_InitStructure.GPIO_Pin = LED0;                                 // &#182;&#203;&#191;ú&#197;&#228;&#214;&#195;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                  
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO&#191;ú&#203;ù&#182;è&#206;a50MHz
          GPIO_Init(GPIOC, &GPIO_InitStructure);       

    TIM_TimeBaseInitStrue.TIM_Period = arr;
    TIM_TimeBaseInitStrue.TIM_Prescaler = psc;
    TIM_TimeBaseInitStrue.TIM_CounterMode =TIM_CounterMode_Up;
    TIM_TimeBaseInitStrue.TIM_ClockDivision =0;
    TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStrue);

    TIM_OCInitTypeStrue.TIM_OCMode =TIM_OCMode_PWM2;
    TIM_OCInitTypeStrue.TIM_OCNPolarity =TIM_OCPolarity_High;
    TIM_OCInitTypeStrue.TIM_OutputState =TIM_OutputState_Enable;               
    TIM_OC3Init(TIM4, &TIM_OCInitTypeStrue);
               
    TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);
    TIM_Cmd(TIM4,ENABLE);
}


最佳答案

查看完整内容[请看2#楼]

u8 dir = 1,flag; u16 timecount,timecount_all; #define led_all 200 //周期 s16 led_low=-20; //低(-20使得低灭彻底) s16 led_high=led_all;//高 void TIM4_IRQHandler(void)//TIM4_Int_Init(19,71); 20us(稍微修改变呼吸频率) { if(TIM_GetITStatus(TIM4,TIM_FLAG_Update)) { timecount++; timecount_all++; if(timecount>=led_low & flag==0)//低 { ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2020-11-7 14:22:13 | 显示全部楼层

u8 dir = 1,flag;
u16 timecount,timecount_all;
#define led_all 200  //周期
s16 led_low=-20;     //低(-20使得低灭彻底)
s16 led_high=led_all;//高
void TIM4_IRQHandler(void)//TIM4_Int_Init(19,71);  20us(稍微修改变呼吸频率)
{
    if(TIM_GetITStatus(TIM4,TIM_FLAG_Update))
    {
        timecount++;
        timecount_all++;
        if(timecount>=led_low & flag==0)//低
        {
            timecount=0;
            LED0=!LED0;
            flag=1;
        }
        if(timecount>=led_high & flag==1)//高
        {
            timecount=0;
            LED0=!LED0;
            flag=0;
        }
        if(timecount_all>led_all)//每个周期结束更改占空比
        {
            timecount_all=0;
            if(dir==1)
            {
                led_low=led_low+1;
                led_high=led_high-1;
                if(led_low>led_all)
                    dir = 0;               
            }
            if(dir==0)
            {
                led_low=led_low-1;
                led_high=led_high+1;
                if(led_high>led_all)
                    dir = 1;   
            }
        }
        TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
    }
}
回复

使用道具 举报

20

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-5-6
在线时间
43 小时
 楼主| 发表于 2020-11-7 16:21:19 | 显示全部楼层
自己顶
回复

使用道具 举报

20

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-5-6
在线时间
43 小时
 楼主| 发表于 2020-11-7 16:24:30 | 显示全部楼层
帮忙看下老哥们
回复

使用道具 举报

20

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-5-6
在线时间
43 小时
 楼主| 发表于 2020-11-7 16:25:17 | 显示全部楼层
@正点原子 原子哥求指点指点
回复

使用道具 举报

20

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-5-6
在线时间
43 小时
 楼主| 发表于 2020-11-7 16:51:39 | 显示全部楼层
再顶,快顶不动了
回复

使用道具 举报

20

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-5-6
在线时间
43 小时
 楼主| 发表于 2020-11-7 17:50:33 | 显示全部楼层
再顶顶,&#128557;
回复

使用道具 举报

20

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-5-6
在线时间
43 小时
 楼主| 发表于 2020-11-7 17:51:06 | 显示全部楼层
求解。sos
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-11-7 19:01:39 | 显示全部楼层
仿真找问题啊,很简单
回复

使用道具 举报

20

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-5-6
在线时间
43 小时
 楼主| 发表于 2020-11-10 17:25:21 | 显示全部楼层
nashui_sx 发表于 2020-11-10 10:52
u8 dir = 1,flag;
u16 timecount,timecount_all;
#define led_all 200  //周期

谢谢老哥,好人一生平安,爱你
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 14:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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