打印
[Zigbee]

CC2530 PWM调光

[复制链接]
906|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gwsan|  楼主 | 2019-7-31 11:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
gwsan|  楼主 | 2019-7-31 11:41 | 只看该作者
2 实验详解
2.1实验目的
1)、过实验掌握CC2530芯片GPIO的配置方法
2)、掌握Led驱动电路及开关Led的原理
3)、掌握按键的使用,实现人机交互
4)、掌握PWM原理

2.2实验设备
硬件:PC 机一台 ZB2530(底板、核心板、仿真器、USB 线) 一套
软件:win7 系统,IAR 8.20 集成开发环境

使用特权

评论回复
板凳
gwsan|  楼主 | 2019-7-31 11:42 | 只看该作者
2.3实验相关电路图

图1 LED电路图

图2 按键电路图

使用特权

评论回复
地板
gwsan|  楼主 | 2019-7-31 11:42 | 只看该作者
2.4实验分析
操作GPIO 口需要了解的寄存器,P0、P1 相同以下只列出P1 的寄存器,在头文件
“ioCC2530.h ”里对所有的寄存器都有定义,如端口0 的方向选择,即为:P0DIR。
如下表所示:

表1 端口0的功能选择


表2 端口0的方向


表3 端口0的输入模式


表4 定时器1的控制与状态



使用特权

评论回复
5
gwsan|  楼主 | 2019-7-31 11:43 | 只看该作者
按照表格寄存器的内容,对P1.0口进行配置,当P1.0输出低电平时D1被点亮。配置如下:
P1DIR |= 0x01; // P1.0 定义为输出
LED1 = 1; // LED1灯初始化为熄灭状态

按键S1配置如下:
P0SEL &= ~0x01; //设置P0.1 为普通IO 口
P0DIR &= ~0x01; //按键接在P0.1口上,设P0.1为输入模式
P0INP &= ~0x01; //打开P0.1 上拉电阻

定时器配置如下:
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定为32M
CLKCONCMD &= ~0x07; //设置系统主时钟频率为32MHZ
CLKCONCMD |= 0x38; //时钟速度32 MHz 定时器标记输出设置[5:3]250kHz

//定时器通道设置
PERCFG |= 0x40; //定时器1 的IO位置 1:备用位置2
P2SEL &= ~0x10; //定时器1优先
P2DIR |= 0xC0; //第1优先级:定时器1通道2-3

P1DIR |= 0xff; //端口1为输出
P1SEL |= 0x01; //timer1 通道2映射口P1_0

//定时器通道2比较值
T1CC2H = 0x00; //20%占空比为200us
//修改T1CC2L可调整led的亮度
//T1CC2L = 0xF7; //1%的正占空比
//T1CC2L = 0xE1; //10%的正占空比
//T1CC2L = 0xC8; //20%的正占空比
//T1CC2L = 0xAF; //30%的正占空比
//T1CC2L = 0x96; //40%的正占空比
T1CC2L = 0x7D; //50%的正占空比
//T1CC2L = 0x64; //60%的正占空比
//T1CC2L = 0x4B; //70%的正占空比
//T1CC2L = 0x32; //80%的正占空比
//T1CC2L = 0x19; //90%的正占空比
//T1CC2L = 0x0A; //99%的正占空比
//T1CC2L = 0x01; //设置通道2比较寄存器初值

//装定时器通道0初值
T1CC0H = 0x00; //1ms的周期时钟,频率为976.516HZ
T1CC0L = 0xff;

T1CCTL2 = 0x1c; // 模式选择 通道2比较模式

//模式设置
T1CTL = 0x02; //250KHz 不分频

使用特权

评论回复
6
gwsan|  楼主 | 2019-7-31 11:43 | 只看该作者
2.5参考代码
2.5.1 PWM调光(模拟方式)
/**Includes*********************************************************************/
#include <ioCC2530.h>
/**宏定义***********************************************************************/
//定义数据类型
#define uint  unsigned int
#define uchar unsigned char

//定义控制灯的端口
#define LED0 P1_0        //定义LED1为P10口控制

/**函数声明*********************************************************************/
void Delay(unsigned int t);   //延时函数
void InitIO(void);                //初始化LED控制IO口函数

/**
  * @brief     主函数
  * @param     None
  * @retval    None
  */
void main (void)
{
  uint CYCLE=600,PWM_LOW=0;//定义周期并赋值
  InitIO();
  while (1)         //主循环
  {
    LED0=1;
    Delay(60000);        //特意加延时,可以看到熄灭的过程
    for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
    {
      //PWM_LOW表示低
      //电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
      LED0=0;        //点亮LED  
      Delay(PWM_LOW);//延时长度,600次循环中从1加至599
      LED0=1;        //熄灭LED
      Delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
    }

    LED0=0;
    for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
    {
      //与逐渐变亮相反的过程   
      LED0=0;
      Delay(PWM_LOW);
      LED0=1;
      Delay(CYCLE-PWM_LOW);   
    }
    //主循环中添加其他需要一直工作的程序
  }
}

使用特权

评论回复
7
gwsan|  楼主 | 2019-7-31 11:43 | 只看该作者
/**
  * @brief     延时函数
  * @param     xms 延时大小
  * @retval    None
  */
void Delay(unsigned int xms)
{
while(xms--);
}

/**
  * @brief     初始化IO
  * @param     None
  * @retval    None
  */
void InitIO(void)
{
  P1DIR |= 0x1;  //P10定义为输出
}

使用特权

评论回复
8
gwsan|  楼主 | 2019-7-31 11:44 | 只看该作者
2.5.2按键控制灯光强度.
/**Includes*********************************************************************/
#include <ioCC2530.h>
/**宏定义***********************************************************************/
//定义数据类型
#define uint  unsigned int
#define uchar unsigned char

//定义控制灯的端口
#define LED1 P1_0        //定义LED1为P10口控制
#define KEY1 P0_1      //KEY1为P0.1口控制

/**函数声明*********************************************************************/

void Delay(unsigned int t); //函数声明
void InitIO(void);                //初始化LED控制IO口函数
void InitKey();

/**
  * @brief     主函数
  * @param     None
  * @retval    None
  */
void main (void)
{                  
  uint CYCLE=600,PWM_LOW=0;//定义周期并赋值
  InitIO();
  InitKey();
  while (1)         //主循环
  {
   
    if(KEY1==0)
    {
      //S1按下,一直按着哦。
      PWM_LOW++;
      if(PWM_LOW>CYCLE)
      {
        PWM_LOW=CYCLE-1;
      }
    }
    else
    {
      PWM_LOW--;
      if(PWM_LOW<1)
      {
        PWM_LOW=1;
      }
    }
   
    if(PWM_LOW==1)
    {
      LED1=0;
    }
    else if(PWM_LOW==CYCLE)
    {
      LED1=1;
    }
    else if(CYCLE>PWM_LOW)
    {
      LED1=1;
      Delay(PWM_LOW);
      LED1=0;
      Delay(CYCLE-PWM_LOW);
    }
  }
  
}

使用特权

评论回复
9
gwsan|  楼主 | 2019-7-31 11:44 | 只看该作者
/**
  * @brief     延时函数
  * @param     t 延时大小
  * @retval    None
  */
void Delay(unsigned int t)
{
while(t)
{
   t--;
   t++;
   t--;
}
}


/**
  * @brief     初始化IO口
  * @param     None
  * @retval    None
  */
void InitIO(void)
{
    P1DIR |= 0x01;  //P10
}

/**
  * @brief     按键初始化函数
  * @param     None
  * @retval    None
  */
void InitKey()
{
  P0SEL &= ~0x01; //设置P0.1为普通IO口
  P0DIR &= ~0X01; //按键接在P0.1口上,设P0.1为输入模式
  P0INP &= ~0x01; //打开P0.1上拉电阻
}

使用特权

评论回复
10
gwsan|  楼主 | 2019-7-31 11:44 | 只看该作者
2.5.3 PWM调光(定时器方式)
/**Includes*********************************************************************/
#include <ioCC2530.h>

/**宏定义***********************************************************************/
//定义数据类型
typedef unsigned char uchar;
typedef unsigned int  uint;

//定义控制灯的端口
#define LED1 P1_0       // P1.0口控制LED1

/**函数声明*********************************************************************/
void InitLed(void);            //LED初始化
void InitT1();                 //定时器初始化
void Delay(unsigned int t);   //延时函数

/**
  * @brief     主函数
  * @param     None
  * @retval    None
  */
void main(void)
{
    uint i;
    uint rate[11]={0xF7,0xE1,0xC8,0xAF,0x96,0x7D,0x64,0x4B,0x32,0x19,0x0A};
   
    InitLed();                     //调用初始化函数
    InitT1();                //定时器初始化及pwm配置
   
    while(1)
    {
      for(i=0;i<11;i++)
      {
        T1CC2H = 0x00;
        T1CC2L = rate[i];
        Delay(50000);
        Delay(50000);
        Delay(50000);
      }
    }

}

使用特权

评论回复
11
gwsan|  楼主 | 2019-7-31 11:44 | 只看该作者
/**
  * @brief     设置LED灯相应的IO口
  * @param     None
  * @retval    None
  */
void InitLed(void)
{
    P1DIR |= 0x01;           //P1.0定义为输出
    LED1 = 0;                //使LED1灯上电默认为熄灭     
}

/**
  * @brief     定时器初始化,TICKSPD 是16 MHz系统不配置时默认是2分频,即16MHz
  * @param     None
  * @retval    None
  */
void InitT1()
{
    CLKCONCMD &= ~0x40;      //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40); //等待晶振稳定为32M
    CLKCONCMD &= ~0x07;      //设置系统主时钟频率为32MHZ   
    CLKCONCMD |= 0x38;       //时钟速度32 MHz 定时器标记输出设置[5:3]250kHz

    //定时器通道设置
    PERCFG |= 0x40;          //定时器1 的IO位置   1:备用位置2
    P2SEL &= ~0x10;          //定时器1优先
    P2DIR |= 0xC0;           //第1优先级:定时器1通道2-3

    P1DIR |= 0xff;           //端口1为输出   
    P1SEL |= 0x01;           //timer1 通道2映射口P1_0

    //定时器通道2比较值
    T1CC2H = 0x00;           //20%占空比为200us
    //修改T1CC2L可调整led的亮度
    //T1CC2L = 0xF7; //1%的正占空比
    //T1CC2L = 0xE1; //10%的正占空比
    //T1CC2L = 0xC8; //20%的正占空比
    //T1CC2L = 0xAF; //30%的正占空比
    //T1CC2L = 0x96; //40%的正占空比
    T1CC2L = 0x7D; //50%的正占空比
    //T1CC2L = 0x64; //60%的正占空比
    //T1CC2L = 0x4B; //70%的正占空比
    //T1CC2L = 0x32; //80%的正占空比
    //T1CC2L = 0x19; //90%的正占空比
    //T1CC2L = 0x0A; //99%的正占空比
    //T1CC2L = 0x01; //设置通道2比较寄存器初值

    //装定时器通道0初值
    T1CC0H = 0x00;           //1ms的周期时钟,频率为976.516HZ
    T1CC0L = 0xff;
   
    T1CCTL2 = 0x1c;          // 模式选择 通道2比较模式
   
    //模式设置
    T1CTL = 0x02;            //250KHz 不分频
}

/**
  * @brief     延时函数
  * @param     xms 延时大小
  * @retval    None
  */
void Delay(unsigned int xms)
{
while(xms--);
}

使用特权

评论回复
12
gwsan|  楼主 | 2019-7-31 11:45 | 只看该作者
2.6实验现象
现象一:看到D1由亮变暗,由暗变亮不断变化。
现象二:按住S1 ,D1慢慢变暗。
现象三:看到D1由亮变暗,由暗变亮不断变化。

使用特权

评论回复
13
conjunction| | 2019-7-31 14:04 | 只看该作者
感谢楼主分享!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

3426

帖子

1

粉丝