3851|2

259

帖子

5

TA的资源

一粒金砂(高级)

楼主
 

PIC16LF1823——timer2_pwm配置 [复制链接]

本帖最后由 Tobey 于 2017-4-23 21:48 编辑

此内容由EEWORLD论坛网友Tobey原创,如需转载或用于商业用途需征得作者同意并注明出处



第一次真正意义上的编写PIC单片机程序,被个PWM折腾了一天,,,总算是解决了,发个帖子记录下

开发环境:
     MPLAB IDE v8.92

硬件:
      PIC16LF1823

调试器:
      PICkit3

引脚配置描述:
RA:
    RA0, RA1, RA2:调试接口
    RA2:输入,接收信号
    RA5:输出,片选信号
RC:
    RC0:输入,检测触摸信号
    RC1:输出,LED
    RC2:PID,timer2_pwm信号输出引脚
    RC3:输出,控制信号

原理图:


程序实现的功能:
1、当RC0引脚检测到触摸事件时通过RC1引脚翻转LED灯状态
2、配置timer2计时器的PWM模块,使RC2引脚输出1KHZ的信号

PWM配置步骤来源:


设置PWM需要计算的变量:
    1、PR2,    2、 CCPR1L:CCP1CON<5:4>
    依据下图所示公式计算:


    提供个快捷计算方式:
     (1、说明:这是一个可以自动依据设定的时钟频率、PWM频率和占空比计算出
       所有相关寄存器取值的代码生成器链接,,
         2、注意:该代码生成器列出的所支持的PIC单片机类型不包括PID16LF1823!
         本人测试结果:生成的PR2, CCPR1L寄存器值可直接使用,T2CON的预分频值
         设定有误!显示的预分频值为16,实际寄存器配置为64,需要修改!!!
         CCP1CON本身并没什么毛病,生成的代码注释也已标注--确保实际使用的PWM
         引脚被配置为数字输出!因此,需要检验CCP1CON的P1M<1:0>的配置是否符
         合实际项目需求,以当前PCB为例,P1D(RC2)需要设置为PWM输出引脚,实际
         生成的P1M<1:0>为00,不符合要求,需要将其修改为01!!!
         PWM代码生成器
    实现功能如图:


遇到过的问题及原因:
1、引脚配置无效: 配置位未配置(__CONFIG())
2、PWM引脚无输出:CCP1CON中的P1M<1:0>配置有误

程序源码:
  1. #include<htc.h>

  2. __CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF&BOREN_ON&CLKOUTEN_OFF&IESO_ON&FCMEN_ON);
  3. __CONFIG(PLLEN_OFF&LVP_OFF) ;

  4. /**
  5.   * [url=home.php?mod=space&uid=159083]@brief[/url]  延迟函数.
  6.   * @param  x: 延迟时间
  7.   * @retval None
  8.   */
  9. void delay(unsigned int x)
  10. {
  11.         unsigned int y,z;
  12.         for(y=x;y>0;y--)
  13.                 for(z=25;z>0;z--);
  14. }

  15. /**
  16.   * @brief  初始化时钟频率.
  17.   * @param  None
  18.   * @retval None
  19.   */
  20. void init_fosc(void)
  21. {
  22.         OSCCON = 0x70; //8MHZ IRCF<3:0>时钟频率选择位设置成8MHZ
  23. }

  24. /**
  25.   * @brief  初始化引脚配置.
  26.   * @param  None
  27.   * @retval None
  28.   */
  29. void init_gpio(void)
  30. {
  31.     PORTC = 0;
  32.     LATC = 0;
  33.     ANSELC = 0;
  34.     TRISCbits.TRISC2=1; //RC2口设置成输出 用来控制蜂鸣器

  35.         TRISCbits.TRISC1=0;//设置RC1为输出
  36.           PORTCbits.RC1=1;   //设置输出高电平,即关闭灯
  37.         TRISCbits.TRISC2=0;//设置RC1为输出
  38.           PORTCbits.RC2=1;   //设置输出高电平,即关闭灯
  39.         
  40.           TRISCbits.TRISC0=1;//设置RC0为输入
  41.           WPUCbits.WPUC0=1;  //设置输入上拉
  42. }

  43. /**
  44.   * @brief  初始化PWM配置.
  45.   * @param  None
  46.   * @retval None
  47.   */
  48. int init_tim2pwm(void)
  49. {
  50.         /* 设置时钟频率8MHz */
  51.     init_fosc();

  52.         /* step 1:通过将相关的 TRIS 位置 1 ,禁止 CCP1 引脚输出驱动器(已经在GPIO初始化中配置,跳过) */
  53.     //init_gpio();

  54.         /* step 2:将 PWM 周期值装入 PR2 寄存器 */
  55.         PR2 = 124 ;

  56.         /* step 3:通过将相应值装入 CCP1CON 寄存器,将 CCP1 模块配置为 PWM 模式 */
  57.         CCP1CON = 0x5f ;

  58.         /* step 4:将 PWM 占空比值装入 CCPR1L 寄存器和CCP1CON 寄存器的 DC1B1 位 */
  59.         CCPR1L = 0x3e ;

  60.         /* step 5:配置和启动 Timer2 */
  61.         TMR2IF=0;//清除TMR2中断标志位
  62.         T2CON = 0x06;

  63.         /* step 6:使能 PWM 输出引脚 */
  64.     while(TMR2IF)
  65.     {
  66.                 TRISCbits.TRISC2=0;
  67.     }
  68. }

  69. /**
  70.   * @brief  程序入口.
  71.   * @param  None
  72.   * @retval None
  73.   */
  74. void main(void)
  75. {
  76.         static bit temp = 0; //定义一个静态的变量
  77.         init_gpio();
  78.         init_tim2pwm();
  79.         delay(1000);  //等一秒,让触摸板校正
  80.           while(RC0);          //等到校正结束

  81.         while(1)
  82.         {
  83.                 if(RC0==1)//按下触摸板
  84.        {
  85.                         while(RC0);//等触摸板变回0,即松开手指
  86.                         {
  87.                                 temp=~temp;//每按一次,位变量temp取反一次
  88.                                 PORTCbits.RC1=temp;//要是第一次触摸,灯不亮,第二次触摸,灯亮,static bit temp = 0; 改为static bit temp = 1;即可
  89.                         }
  90.        }   
  91.                
  92.         }

  93. }
复制代码






最新回复

PIC单片机可以用MCC产生配置代码,就像STM32Cube一样。  详情 回复 发表于 2017-4-23 22:51

赞赏

1

查看全部赞赏

点赞 关注
 

回复
举报

1万

帖子

25

TA的资源

版主

沙发
 
PIC单片机可以用MCC产生配置代码,就像STM32Cube一样。

点评

没用过,多谢版主!下个学习学习去  详情 回复 发表于 2017-4-24 09:20
 
 
 

回复

259

帖子

5

TA的资源

一粒金砂(高级)

板凳
 
dcexpert 发表于 2017-4-23 22:51
PIC单片机可以用MCC产生配置代码,就像STM32Cube一样。

没用过,多谢版主!下个学习学习去
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表