CC2530基础实验四:Timer和PWM

概述

定时器在一个单片机上是不可或缺的。很多的控制和测量都基于定时器的功能才能够实现。
硬件定时器一般分为两种工作模式:定时器模式和计数器模式,分别对应着输出和输入。其中:

计数器模式: 对输入引脚的外部脉冲进行计数,比较典型的应用就是编码器了,用来计数脉冲形成闭环系统。

定时器模式: 对内部的脉冲进行计数,配合用户设定的阈值可以达到基于频率的定时事件,比较典型的应用就是PWM了,用来调节LED灯或直流电机等。

计数器: 不论是上述哪一种模式,本质都是通过内部的计数器对脉冲信号进行计数。计数器具体是什么,其实不需要知道,把它当成一个黑匣子,一旦计数周期一到,它就会自动的加一或是减一。一旦达到了最大值,就会溢出,然后再从零或是最大值开始循环。8位计数器的最大值为255,16位定时器的最大值为65525,这个最大值用户也可以自己定义,不超过硬件最大值即可。

计数频率: 系统的时钟频率最后都会稳定在一个值上,假设系统的时钟频率是1MHz,那么计数周期(也就是上述的每隔一段时间计数器加一或减一的周期)就为1/1000000 = 1μs,即每过1μs,上面说的计数器就会加一或减一,如果是一个16位的计数器,使用默认的最大值作为溢出值,那么也就是从开启定时器开始,经过65535μs,也就是65.535ms,定时器就会溢出,这样就可以得到一个周期为65.535ms的定时器。当然,人为的修改这个最大值,就可以实现自己想要的定时时间。

PWM: 脉冲宽度调制,知道它是一个方法就够了。通过这个方法调出来的PWM信号,可以实现最常用的对LED灯的亮度调节以及对直流电机的速度调节。

原理:


如果我们对一个LED灯编程,设置为1s亮1s灭循环,那么你的眼睛看到的就是一个LED灯在周期性的闪烁,但是当这个周期变得极其短,短到人眼已经无法分辨出来,例如现在编程实现这个LED灯10ms亮10ms灭,实际上这个灯是在以20ms为周期进行快速的闪烁,但是你所看到的就是这个灯的亮度变成了它最大亮度的一半。改变这个比例就能够实现不同的亮度变化,这就是PWM能够对LED的亮度和直流电机速度进行调节的原因。


代码

我直接就是代码🥴

#include <ioCC2530.h>
typedef unsigned char uchar;
typedef unsigned int  uint;

/****************************
该示例简单的使用了定时器1的PWM。
上电后LED1会自动的进行呼吸灯状态。
按下KEY1后不松手LED2会持续的变亮,松手之后LED2就会逐渐变灭。
串口发送1-5,可以直接设置LED2的亮度,数字越高亮度越低,具体如下数组。
****************************/

#define LED1 P1_0	//LED1对应IO
#define LED2 P1_1	//LED2对应IO
#define KEY1 P0_1	//KEY1对应IO

char msg[147]="该串口输入用于PWM模式\r\n\r\n输入1占空比为0 输入2占空比为25% 输入3占空比为50% 输入4占空比为75% 输入5占空比为100%\r\n\r\n占空比越小灯越亮,占空比越大灯越暗";

char rxdata;		//uart接收到的数据

void InitT1()
{
   
	CLKCONCMD |= 0x38;		//定时器标记输出250kHz,定时器的频率即为250kHz

	PERCFG |= 0x40;			//将IO口映射到备用位置2,使通道1、2映射到两个LED灯上

	P1SEL |= 0x03;			//P1_0和P1_1设置为定时器1外设
	
	T1CTL |= 0x03;			//正计数倒计数模式
	T1CC0H = 0x00;
	T1CC0L = 0xFF;			//1ms的周期时钟 1/(250000/1)*255=1ms
	T1CCTL1 = 0x24;			//通道1比较模式
	T1CCTL2 = 0x24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值