SYD8801 PWM使用说明

来源:互联网 发布:js中json对象添加元素 编辑:程序博客网 时间:2024/05/21 23:00

SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机、32位ARM Cortex-M0处理器、128kB Flash存储器、以及丰富的数字接口。SYD8801片上集成了Balun无需阻抗匹配网络、高效率DCDC降压转换器,适合用于可穿戴、物联网设备等。具体可咨询:http://www.syd-tek.com/

         SYD8801 PWM使用说明

         Syd8801的PWM模块支持三种模式:闪光、PWM、呼吸灯,他们的时序如下:


         使用内部定时器的话必须经过校准,对于外设驱动代码使用LPOCaliWaitUS函数进行校准,如果代码中包含了《syd_ble_keil.lib》库,则调用LPOCalibration函数进行校准。使用内部32.768Khz时钟的PWM程序如下:

static voidtimer2_callback(void);

uint8_t j=0;

int main()

{

         uint8_t i=0;

         PWM_PARAMETER pwm_parameter;

         if(LPOCaliWaitUS(1000)){   //这是内部RC32k晶振的校准函数                  for(i=0;i<6;i++){

                            led_turn(LEDALL);

                            delay_ms(300);

                   }

         }else{

                   for(i=0;i<20;i++){

                            led_turn(LEDALL);

                            delay_ms(300);

                   }

         }

         //Flash mode

         pwm_parameter.MODE=flash_mode;

         pwm_parameter.T1=0x10;     //16 * 1/32=0.5s 实测0.768563250

         pwm_parameter.T2=0x20;      //32 * 1/32=1s  实测1.585201375

         pwm_parameter.T3=0x0000;

         pwm_parameter.N1=0x80;  

         pwm_parameter.N2=0x80; 

  pwm_enable(PWM_0,pwm_parameter);           

         //Breath mode timing  

         pwm_parameter.MODE=breath_mode;

         pwm_parameter.BR_TH_MAX=0x28;   //255/2=125.5ms

         pwm_parameter.BR_TH_MIN=0x02;  //2/2=1ms

         pwm_parameter.T4=0x28;   //255/2=125.5ms 

         pwm_parameter.BR_SP=0x0f;  //255/32=7.96876ms

  pwm_enable(PWM_1,pwm_parameter);                                                          

         //PWM mode timing

         pwm_parameter.MODE=pwm_mode;

         pwm_parameter.PWM_M=0xff;  

         pwm_parameter.PWM_N=0xCF; 

  pwm_enable(PWM_2,pwm_parameter);

        

         timer_2_enable(0x7D00,timer2_callback); // 32000 /31.25 ms = 976.5625 ms

         while(1)

         {

                   if(j>180){   //最晚三分钟必须再校准一次

                            j=0;

                            LPOCaliWaitUS(1000);

                   }

         }

}

static voidtimer2_callback(void)

{

         j++;

}

     这里要注意的是:这是因为现在使用的是内部的时钟基准,没有校准过的内部的时钟存在着很大的误差,所以调用LPOCaliWaitUS函数校准,并且3分钟必须校准一次。

如果这里使用32.768Khz的外部晶振则不需要校准,下面是使用外部32.768Khz的程序:

int main()

{

         uint8_tdata;

         PWM_PARAMETERpwm_parameter;

        

         BBRFWrite(0x7F,0x00); // switch Bank A  

         BBRFRead(0x03,&data); //读回要配置的寄存器

         BBRFWrite(0x03,data | 0x04); //置位B_M2_32KXtal_EN,打开外部晶振

         BBRFWrite(0x7F,0x02); // switch Bank C

         BBRFRead(0x00,&data); 

         BBRFWrite(0x00,data | 0x01);  //置位RG_CLK32K_SEL,使定时器使用外部32k晶振

         //Flashmode

         pwm_parameter.MODE=flash_mode;

         pwm_parameter.T1=0x10;    //16 * 1/32=0.5s

         pwm_parameter.T2=0x20;      //32 * 1/32=1s

         pwm_parameter.T3=0x0000;

         pwm_parameter.N1=0x80;   //永久重复,没有T3

         pwm_parameter.N2=0x80;   //永久重复

 pwm_enable(PWM_0,pwm_parameter);           

         //Breathmode timing 

         pwm_parameter.MODE=breath_mode;

         pwm_parameter.BR_TH_MAX=0x28;   //40/2=20ms

         pwm_parameter.BR_TH_MIN=0x0A;  //10/2=1ms

         pwm_parameter.T4=0x28;   //40/2=20ms

         pwm_parameter.BR_SP=0x0f;  //15/32ms=0.46875ms

 pwm_enable(PWM_1,pwm_parameter);                                                          

         //PWMmode timing

         pwm_parameter.MODE=pwm_mode;

         pwm_parameter.PWM_M=0xff;   //255/32ms=7.96875ms

         pwm_parameter.PWM_N=0xCF;   //207/32ms=6.46875ms

 pwm_enable(PWM_2,pwm_parameter);

         while(1)

         {

 

         }

}

 

最后注意一点:PWM和定时器是独立的单元,也就是说SYD8801有三路定时器,三路PWM

 

这里上传本门设计的源代码:

http://download.csdn.net/detail/chengdong1314/9819167

其中:

《08PWM》使用内部晶振

《08PWM_32KXtal》使用外部32.768Khz晶振

0 0
原创粉丝点击