[通用8051核FLASH系列] HC89S003P套件试用】占空比与频率都不相同的PWM!

[复制链接]
 楼主| hayden0 发表于 2019-3-22 18:11 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-25 10:42 编辑

HC89S003最强大的就是PWM了,用过不少003单片机,唯有芯圣最强大,最喜欢的就是芯圣003的PWM和引脚全映射功能。
首先说一下引脚全映射,太好用了有木有!

TXD_MAP = 0x21;                                                //TXD映射P21
RXD_MAP = 0x03;                                                //RXD映射P03        


PWM0_MAP = 0x22;                                          //PWM0通道映射P22口
PWM01_MAP = 0x10;                                          //PWM01通道映射P10口


映射引脚直接就是对应的HEX值,使用时信手拈来,根本不用记!
就是STM32的引脚映射也是只能映射到固定引脚上。

再说PWM,3个12位PWM模块PWM0、PWM1、PWM2,每个模块各有一个计数器(定时器),三个PWM模块的功能以及操作完全一样

看我画的重点,“各有一个计数器”,“各有一个计数器”,“各有一个计数器”,重要事情说三遍!纵观台系和国产里的51单片机,介绍一大堆PWM相关,突出什么多通道,到头来所有PWM共用一个定时器,多通道输出时输出的PWM虽然占空比不同,但都是一个频率,这对需要多频率的场合来说就聊败于无!
也只有ARM单片机才是通过不同定时器输出不同频率PWM。

感觉HC89S003就是一个具有32位单片机外设,却有一个51核心,开外挂的单片机。
独立模式下PWM0输出:

P90322-155432.jpg


互补模式下PWM0输出:

P90322-175546.jpg


PWM0和PWM1输出不同占空比和不同频率PWM:

P90322-163921.gif

关键函数:

  1. void PWM_Set_Duty(u8 PWMx, u8 duty)
  2. {
  3.         u16 dutyLoad;
  4.         u16 dutyValue;
  5.         switch(PWMx)
  6.         {
  7.         case 0:
  8.                                         dutyLoad = PWM0PH;
  9.                                         dutyLoad = dutyLoad<<8;
  10.                                         dutyLoad |= PWM0PL;
  11.                                         dutyValue =(double)dutyLoad *duty/100 ;
  12.                                         PWM0DH = dutyValue >> 8;
  13.                                         PWM0DL = dutyValue & 0xFF;
  14.                                         PWM0DTH = dutyValue >> 8;
  15.                                         PWM0DTL = dutyValue & 0xFF;
  16.                                         break;
  17.         case 1:
  18.                                         dutyLoad = PWM1PH;
  19.                                         dutyLoad = dutyLoad<<8;
  20.                                         dutyLoad |= PWM1PL;
  21.                                         dutyValue =(double)dutyLoad *duty/100 ;
  22.                                         PWM1DH = dutyValue >> 8;
  23.                                         PWM1DL = dutyValue & 0xFF;
  24.                                         break;
  25.         case 2:
  26.                                         dutyLoad = PWM2PH;
  27.                                         dutyLoad = dutyLoad<<8;
  28.                                         dutyLoad |= PWM2PL;
  29.                                         dutyValue =(double)dutyLoad *duty/100 ;
  30.                                         PWM2DH = dutyValue >> 8;
  31.                                         PWM2DL = dutyValue & 0xFF;
  32.                                         break;
  33.         case 3:
  34.                                         dutyLoad=PWM3P;
  35.                                         dutyValue =(double)dutyLoad *duty/100 ;
  36.                                         PWM3D = dutyValue;
  37.                                         break;
  38.         
  39.         default:
  40.                                         break;
  41.         }
  42.         //
  43.         
  44. }

以后用这个函数就可以方便的设置HC89S003的4个PWM占空比了。




您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

295

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部