找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2542|回复: 14
收起左侧

利用STM32核心板去实现呼吸灯,求大神给个思路

  [复制链接]
ID:924919 发表于 2021-6-9 12:41 来自手机 | 显示全部楼层 |阅读模式
50黑币
利用STM32核心板去实现呼吸灯,利用PWM外设(不能使用延时及中断服务函数)开发板为STM32F103C8T6

回复

使用道具 举报

ID:635975 发表于 2021-6-9 13:39 | 显示全部楼层
可以试试这个,stm32f1的

pwm呼吸灯.zip

2.88 MB, 下载次数: 39

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:716656 发表于 2021-6-9 14:07 | 显示全部楼层
论坛里搜呼吸灯,你选下是用pwm的,大把。连程序,电路图啥都有

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:609192 发表于 2021-6-9 14:32 | 显示全部楼层
呼吸灯可以用PWM和定时器实现
回复

使用道具 举报

ID:366877 发表于 2021-6-9 14:40 | 显示全部楼层
呼吸灯实际体现的是PWM波的控制能力,其占空比按照三角波规律实现即可。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:160500 发表于 2021-6-10 12:29 | 显示全部楼层
呼吸灯好实现,关键是给的条件:(不能使用延时及中断服务函数),这个意思就是纯硬件来实现了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:486138 发表于 2021-6-10 14:48 | 显示全部楼层
liuzx66 发表于 2021-6-10 12:29
呼吸灯好实现,关键是给的条件:(不能使用延时及中断服务函数),这个意思就是纯硬件来实现了

这个要求好奇葩,不用延时好理解,不用中断还怎么搞

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:81196 发表于 2021-6-15 13:50 | 显示全部楼层

呼吸灯实际是PWM的占空比决定,也就是单位周期内高低电平的占比大小。这样就形成了一个可控而且范围相对比较大的模拟输出控制。驱动能力可以用小mos/三极管或大功率管都可以.

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:811711 发表于 2021-6-16 11:07 | 显示全部楼层
呼吸灯就采用PWM,想要多长的间隔,就设置不同的占空比。多看看基础知识

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:160860 发表于 2021-8-17 12:25 | 显示全部楼层
建议学习一下正点原子的例程,讲解的很详细,首先学会配置pwm

//TIM3 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定时器3时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
       
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5   

   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形        GPIOB.5
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

   //初始化TIM3
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
       
        //初始化TIM3 Channel2 PWM模式         
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

        TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器

        TIM_Cmd(TIM3, ENABLE);  //使能TIM3
       

}



然后在main函数里初始化并调用


int main(void)
{               
        u16 led0pwmval=0;
        u8 dir=1;       
        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(115200);         //串口初始化为115200
        LED_Init();                             //LED端口初始化
        TIM3_PWM_Init(1000,0);         //不分频。PWM频率=72000000/900=80Khz
//    TIM_SetCompare2(TIM3,200);
           while(1)
        {
                delay_us(100);         
                if(dir)led0pwmval++;
                else led0pwmval--;

                if(led0pwmval>300)dir=0;
                if(led0pwmval==0)dir=1;
        LED1=!LED1;        
                  
        }         
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:336165 发表于 2021-8-19 19:34 | 显示全部楼层
计数呗,while循环里,引脚高低电平切换,计数,计数到给定值,跳到另一个循环,100电平循环,再计数到给定值后,跳到另一个循环里,1000电平跳变,这样占空比不就改变了么

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:108819 发表于 2021-8-19 21:27 | 显示全部楼层
你可以去看看正点原子的例程,里面有介绍PWM来实现呼吸灯的效果

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:959346 发表于 2021-8-20 08:40 | 显示全部楼层
初始化PWM,使用的定时器的时基设小一点,计数值设置大一点(后面可调的范围大一点),输出PWM,点亮LED。然后在主循环内,定时递增PWM占空比->到最大后递减PWM占空比->到最小后再回到递增PWM占空比,循环反复,通过调节定时变化的间隔,调节呼吸的速度。
回复

使用道具 举报

ID:655518 发表于 2021-8-20 09:20 | 显示全部楼层
不用延时不用中断的话,那就是定时器计数功能,然后使用定时器的PWM输出功能应该就可以了
回复

使用道具 举报

ID:584195 发表于 2021-8-20 09:29 | 显示全部楼层
Jiang_YY 发表于 2021-8-20 08:40
初始化PWM,使用的定时器的时基设小一点,计数值设置大一点(后面可调的范围大一点),输出PWM,点亮LED。然 ...

此楼是正解!
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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