本帖最后由 芯圣电子官方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输出:
互补模式下PWM0输出:
PWM0和PWM1输出不同占空比和不同频率PWM:
关键函数:
void PWM_Set_Duty(u8 PWMx, u8 duty)
{
u16 dutyLoad;
u16 dutyValue;
switch(PWMx)
{
case 0:
dutyLoad = PWM0PH;
dutyLoad = dutyLoad<<8;
dutyLoad |= PWM0PL;
dutyValue =(double)dutyLoad *duty/100 ;
PWM0DH = dutyValue >> 8;
PWM0DL = dutyValue & 0xFF;
PWM0DTH = dutyValue >> 8;
PWM0DTL = dutyValue & 0xFF;
break;
case 1:
dutyLoad = PWM1PH;
dutyLoad = dutyLoad<<8;
dutyLoad |= PWM1PL;
dutyValue =(double)dutyLoad *duty/100 ;
PWM1DH = dutyValue >> 8;
PWM1DL = dutyValue & 0xFF;
break;
case 2:
dutyLoad = PWM2PH;
dutyLoad = dutyLoad<<8;
dutyLoad |= PWM2PL;
dutyValue =(double)dutyLoad *duty/100 ;
PWM2DH = dutyValue >> 8;
PWM2DL = dutyValue & 0xFF;
break;
case 3:
dutyLoad=PWM3P;
dutyValue =(double)dutyLoad *duty/100 ;
PWM3D = dutyValue;
break;
default:
break;
}
//
}
以后用这个函数就可以方便的设置HC89S003的4个PWM占空比了。
|