cc2530定时器时间计算1产生pwm控制舵机

他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)查看: 23|回复: 1
cc2530 定时计数器1产生1毫秒PWM
1 /****************************************************************************
2 * 文 件 名: main.c
3 * 描& & 述: cc2530 定时计数器1产生1毫秒PWM,20%的占空比,led的亮度比较暗
4 *& && && &&&可调整pwm频率和占空比来控制Led灯的亮度
5 ****************************************************************************/
6 #include &ioCC2530.h&
9 typedef unsigned int&&
11 #define LED1 P1_0& && & // P1.0口控制LED1
14 /****************************************************************************
15 * 名& & 称: InitLed()
16 * 功& & 能: 设置LED灯相应的IO口
17 * 入口参数: 无
18 * 出口参数: 无
19 ****************************************************************************/
20 void InitLed(void)
22& &&&P1DIR |= 0x01;& && && &&&//P1.0定义为输出
23& &&&LED1 = 1;& && && && && & //使LED1灯上电默认为熄灭& &&&
26 /****************************************************************************
27 * 名& & 称: InitT1()
28 * 功& & 能: 定时器初始化,TICKSPD 是16 MHz系统不配置时默认是2分频,即16MHz
29 * 入口参数: 无
30 * 出口参数: 无
31 ****************************************************************************/
32 void InitT1()
34& &&&CLKCONCMD &= ~0x40;& && &//设置系统时钟源为32MHZ晶振
35& &&&while(CLKCONSTA & 0x40); //等待晶振稳定为32M
36& &&&CLKCONCMD &= ~0x07;& && &//设置系统主时钟频率为32MHZ& &
37& &&&CLKCONCMD |= 0x38;& && & //时钟速度32 MHz 定时器标记输出设置[5:3]250kHz
39& &&&PERCFG |= 0x40;& && && & //定时器1 的IO位置& &1:备用位置2
40& &&&P2SEL &= ~0x10;& && && & //定时器1优先
41& &&&P2DIR |= 0xC0;& && && &&&//第1优先级:定时器1通道2-3
43& &&&P1DIR |= 0& && && &&&//端口1为输出& &
44& &&&P1SEL |= 0x01;& && && &&&//timer1 通道2映射口P1_0
46& &&&T1CC2H = 0x00;& && && &&&//20%占空比为200us
47& &&&T1CC2L = 0x32;& && && &&&//修改T1CC2L可调整led的亮度
48& &&&T1CC0H = 0x00;& && && &&&//1ms的周期时钟,频率为976.516HZ
49& &&&T1CC0L = 0
50& &&&T1CCTL2 = 0x1c;& && && & // 模式选择 通道2比较模式
51& &&&T1CTL = 0x02;& && && && &//250KHz 1分频
54 /****************************************************************************
55 * 程序入口函数
56 ****************************************************************************/
57 void main(void)
59& &&&InitLed();& && && && && &&&//调用初始化函数
60& &&&InitT1();& && && && && & //定时器初始化及pwm配置
61& &&&while(1)
Powered by& 开始用的是 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可描述如下:
T3CNT = 0x00;
T3CC0 = 0x55;
while(1) {
if (T3CNT &= T3CC0)
if(T3CNT == 0xFF) {
T3CNT = 0x00;
下面附上一个更加简洁的图片:
如图所示:每次T3CNT的值达到T3CC0的时候,如果我们有设置,I/O端口就该有变化了。变化稳定持续的时间是T3CNT继续加加到0xFF 的时间。然后将清零、翻转。
&I/O 高低电平在X轴上分别持续的时间,分别以蓝色和紫色线标示出来了。如图所示,我们只需更改T3CC0的值,就可以控制它们的比例&
ok &贴上代码:
1 void int_port_timer3(void)
P1DIR |= 0x80;
P1SEL |= 0x80;
P2SEL |= 0x20;
PERCFG |= 0x20;
9 void init_timer3(void)
T3CC0 = 0x55;
T3CCTL0 = 0x2C;
T3CTL = 0xB0;
//别忘记了启动timer 3,
第4位为启动位,应该设为 1
16 void start_timer3(void)
int_port_timer3();
init_timer3();
代码已经不需要解释了,前面很清楚了。至于timer 3的通道1,如上面添加下 T3CC1 &T3CTL1两个寄存器即可。
参考本人另外一篇笔记:
阅读(...) 评论()
&.getScript('http://s1.bdstatic.com/r/www/cache/baidu_search/baiduSearch-1.4.js', function () {
baidusearch.init("shiny_chinese");

我要回帖

更多关于 cc2530定时器时间计算 的文章

 

随机推荐