博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cc2530 timer 3 PWM <可调占空比>
阅读量:6086 次
发布时间:2019-06-20

本文共 1822 字,大约阅读时间需要 6 分钟。

前提:

  开始用的是 cc2530 timer 1来做PWM的,已经可调占空比了,但是由于硬件的改动,需要用timer 3 和 timer 4 代替。由于调试过程中出了些小问题,于是自己把这个贴出来。关键点注释出来。

 

说说  硬件吧:    

 

timer 1    P1_0 口

timer 3   P1_6   P1_7口。

 注意: P1_6 对应着timer 3的通道 0 ,也就是对应着 t3cc0 这类寄存器,而非t3cc1; P1_7对应着timer 3的通道1,也就是对应着t3cc1 这类寄存器。不同的通道,对应着不同的端口。当然,也要选择I/O为外设功能、且将它置为 保留地址2.<具体看代码>

<硬件就没了>

 

设置timer 3 ,很简单的,只是需要3个寄存器,网络上的资料要么为了编程技巧,写的很复杂。

 timer 3 通道 0的寄存器编程,只需要对这三个寄存器进行操作即可:  T3CTL\T3CCTL0\T3CC0,如下图:

 其中,T3CNT这个寄存器的属性属于只读属性,向它写值是没有作用的。但是抱歉的是,网络上很多资料都对它赋值,这完全是不需要的。

另外,在output compare mode 下, 要修改 T3CCTLx  T3CCx 的值,必须要等到 T3CNT里面的值清为 0x00 才行,如图:

 

 

 下面是我对 T3CTL寄存器的设置:

 分频、中断失能<非使能>、自由运行模式。<在其他运行模式下没有成功调占空比>

 

下面是 T3CCTL0 的设置 <自己只是使用了timer 3的通道 0>

注意这个寄存器的 [5:3] 位, 必须选择为 101  ,否则无法调占空比<具体原因后面附图>

 

至于 T3CC0, 这个里面的值不可以超过 0xFF <当然也无法超过0xFF ~~>.

这整个运行的过程描述如下。

T3CNT 的寄存器 从 0x00 开始不断的 加1 <加1的方式见手册>,每次加1,就和T3CC0的值进行比较。 如果规定在T3CNT 等于 0x00的时候,I/O口的电平为低;当T3CNT的值等于或者大于T3CC0的时候,将I/O口的电平翻转为高;在0xff的时候,将T3CNT的值清为0 <这个清零的过程,是硬件机制做,无法人工干预--唯一能做的是在 T3CTL里面设置>,那么用简短的C可描述如下:

 

1 { 2     T3CNT = 0x00; 3     T3CC0 = 0x55; 4     P1_6 = 0; 5     while(1) { 6     T3CNT++; 7     if (T3CNT >= T3CC0) 8         P1_6 = 1; 9     if(T3CNT == 0xFF) {10         P1_6 = 0;11         T3CNT = 0x00;12     }13 }

下面附上一个更加简洁的图片:

如图所示:每次T3CNT的值达到T3CC0的时候,如果我们有设置,I/O端口就该有变化了。变化稳定持续的时间是T3CNT继续加加到0xFF 的时间。然后将清零、翻转。

<I/O 高低电平在X轴上分别持续的时间,分别以蓝色和紫色线标示出来了。如图所示,我们只需更改T3CC0的值,就可以控制它们的比例>

----

ok  贴上代码:

 

1 void int_port_timer3(void) 2 { 3     P1DIR |= 0x80; 4     P1SEL |= 0x80; 5     P2SEL |= 0x20; 6     PERCFG |= 0x20; 7 } 8  9 void init_timer3(void)10 {11     T3CC0 = 0x55;12     T3CCTL0 = 0x2C;13     T3CTL = 0xB0;  //别忘记了启动timer 3,  第4位为启动位,应该设为 114 }15 16 void start_timer3(void)17 {18     int_port_timer3();19     init_timer3();20 }

代码已经不需要解释了,前面很清楚了。至于timer 3的通道1,如上面添加下 T3CC1  T3CTL1两个寄存器即可。

参考本人另外一篇笔记:

 

 

转载于:https://www.cnblogs.com/chineseboy/p/3741870.html

你可能感兴趣的文章
红帽混合云坚持开放
查看>>
什么是linux,linux的应用与发展
查看>>
使用Sqlite Select返回满足条件的第一条与最后一条记录
查看>>
Android应用程序启动过程源代码分析(5)
查看>>
SSHv1版本的crc32漏洞
查看>>
windows phone发布时其他注意事项
查看>>
一把手的态度决定产品质量
查看>>
用Proxmox搞定gpu穿透
查看>>
18个有趣的API供你的前端开发测试之用
查看>>
从一个职校走出来的高级程序员
查看>>
案例:低迷的产品研发团队
查看>>
Hadoop系列之一:大数据存储及处理平台产生的背景
查看>>
vector容器与find算法
查看>>
《从零开始学Swift》学习笔记(Day 19)——函数参数传递
查看>>
corosync+pacemaker高可用集群
查看>>
看完就能出去神侃,来自研发第一线的“区块链”扫盲文(一)
查看>>
比较全的 POM.xml
查看>>
7.VMware View 4.6安装与部署-connection server(View Security Server)
查看>>
Hyper-V下安装Ossim系统
查看>>
LBS营销的核心是资源共享与互换
查看>>