[PIC®/AVR®/dsPIC®产品] 【CuriosityNano测评报告】+PIC16F15244 PWM呼吸灯

[复制链接]
2276|24
 楼主| qjp1988113 发表于 2021-1-12 09:57 | 显示全部楼层 |阅读模式
今天我们来试下PIC16F15244的PWM功能,我们把PWM输出引脚关联到板载的LED上,让它来控制LED灯光强弱的变化。
好了,我们新建工程,打开MCC,配置PWM,我们使用TIMER2的PWM3:
我们这里配置PWM的频率为1KHz,占空比开始为0,然后10%递加,到达100%后,再10%的递减,到达0后,在次循环。


点击生成代码,
代码上初始的测试时50%的占空比的,我们用示波器看下PA2即LED的输出引脚,看下波形输出:

波形完全正常。
我们需要做的就是main函数的while循环里,每隔一段时间改变一下PWM的占空比duty值:
  1. void main(void)
  2. {
  3.     volatile uint16_t pwmduty=0;//占空比
  4.     volatile uint8_t  pwmdir=0; //方向
  5.     // initialize the device
  6.     SYSTEM_Initialize();

  7.     // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
  8.     // Use the following macros to:

  9.     // Enable the Global Interrupts
  10.     INTERRUPT_GlobalInterruptEnable();

  11.     // Enable the Peripheral Interrupts
  12.     INTERRUPT_PeripheralInterruptEnable();

  13.     // Disable the Global Interrupts
  14.     //INTERRUPT_GlobalInterruptDisable();

  15.     // Disable the Peripheral Interrupts
  16.     //INTERRUPT_PeripheralInterruptDisable();
  17.    
  18.    
  19.     while (1)
  20.     {
  21.         // Add your application code
  22.         //LED_Toggle();
  23.         //printf("Hello world!\r\n");
  24.         //delay_ms(500);
  25.         
  26.         //LED_Toggle();
  27.         
  28.         PWM3_LoadDutyValue(pwmduty);
  29.         printf("now pwm duty is %d!\r\n",pwmduty);
  30.        // __delay_ms(500);
  31.         delay_ms(1000);
  32.         
  33.         if(pwmdir==0)
  34.         {
  35.             pwmduty=pwmduty+100;
  36.             if(pwmduty>=1000)
  37.             {
  38.                 pwmdir=1;//切换方向
  39.                 pwmduty=500;
  40.             }
  41.         }
  42.         else
  43.         {
  44.             pwmduty=pwmduty-100;
  45.             if(pwmduty<=10)
  46.             {
  47.                 pwmdir=0;//切换方向
  48.                 pwmduty=0;
  49.             }      
  50.         }
  51.         
  52.     }
  53. }
代码还是比较简单的,用MCC配置,真的省了不少事情啊~
看下LED的波形和亮度变化图片:


除此之外还开了TIMER0 500ms的中断,和TIMER2 300MS的中断,完全能够正常运行:

好了,PWM就到这~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
永远不停 发表于 2021-3-3 10:40 | 显示全部楼层
请教个问题:按照你的配置方式,能正常产生PWM波形。
TIMER2的时钟选择是FOSC/4,而当将时钟修改为FOSC时,则无法输出波形了,这是怎么回事?
 楼主| qjp1988113 发表于 2021-3-3 11:12 | 显示全部楼层
永远不停 发表于 2021-3-3 10:40
请教个问题:按照你的配置方式,能正常产生PWM波形。
TIMER2的时钟选择是FOSC/4,而当将时钟修改为FOSC时, ...

不应该啊,我板子不在手头,等我有空看下~
gygp 发表于 2021-3-4 13:54 | 显示全部楼层
  PWM的占空比越大,那么释放的能量越高  
chenci2013 发表于 2021-3-4 13:54 | 显示全部楼层
怎么控制PWM从而实现呼吸灯效果  
biechedan 发表于 2021-3-4 13:55 | 显示全部楼层
pic16f877与16f877A 有什么区别?
wangdezhi 发表于 2021-3-4 13:55 | 显示全部楼层
一般只关心频率和占空比的问题  
isseed 发表于 2021-3-4 13:55 | 显示全部楼层
         
xietingfeng 发表于 2021-3-4 13:56 | 显示全部楼层
使用PWM3来驱动一个电压来控制LED驱动芯片中的电流
suzhanhua 发表于 2021-3-4 13:56 | 显示全部楼层
有效果图吗   
mituzu 发表于 2021-3-4 13:57 | 显示全部楼层
用的是PIC16F1574
hellosdc 发表于 2021-3-4 14:02 | 显示全部楼层
16 位 PWM 可提供 4 个额外的 16 位定时器   
uiint 发表于 2021-3-4 14:04 | 显示全部楼层
如何用电容按键调节PWM做LED呼吸灯
wangdezhi 发表于 2021-3-4 14:04 | 显示全部楼层
PIC16系列的PWM模块要怎么设置才能输出10位的PWM?
isseed 发表于 2021-3-4 14:04 | 显示全部楼层
学习了。              
biechedan 发表于 2021-3-4 14:04 | 显示全部楼层
PIC16系列的bank去如何使用和调用
xietingfeng 发表于 2021-3-4 14:04 | 显示全部楼层
PIC16F877 产生PWM波形需确定两个基本参数:一个是周期(高电平和低电平持续时间之和),另一个是脉宽(高电平持续时间)
suzhanhua 发表于 2021-3-4 14:04 | 显示全部楼层
感谢楼主分享的资料。   
gygp 发表于 2021-3-4 14:05 | 显示全部楼层
谢谢楼主的资料了。  
mituzu 发表于 2021-3-4 14:05 | 显示全部楼层
PWM可达10位精度?   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

627

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部