以下使用CH592X做验证
CH59X系列相对于CH58X,CH57X系列的8位系统PWM多了6路的16位的PWM。
CH59X除了定时器提供的 4 路 26 位 PWM 输出之外,系统还提供了 8 路 8 位 PWM 输出(PWM4~PWM11)或 6 路 16 位 PWM 输出(PWM4~PWM9),占空比可调。
现在的PWMX例程中没有16位PWM的使用程序。
先看手册中对16位PWM的使用说明。
在使用是需要对PWMx 配置控制寄存器进行配置;
需要使用16位的根据手册提示程序中做如下配置即可:PWMX_CycleCfg(PWMX_Cycle_32);/PWMX_CycleCfg(PWMX_Cycle_31);
对应PWM通道根据现在支持的通道使用,下面以PWM4为例;现在提供的例程中没有将封好16位的PWM的API,现在使用的话参照8位的PWM的使用即可;
下面是8位的PWM使用的函数:
void PWMX_ACTOUT(uint8_t ch, uint8_t da, PWMX_PolarTypeDef pr, FunctionalState s) { uint8_t i; if(s == DISABLE) { R8_PWM_OUT_EN &= ~(ch); } else { (pr) ? (R8_PWM_POLAR |= (ch)) : (R8_PWM_POLAR &= ~(ch)); for(i = 0; i 8; i++) { if((ch >> i) & 1) { *((volatile uint8_t *)((&R8_PWM4_DATA) + i)) = da; } } R8_PWM_OUT_EN |= (ch); } }
(Low_Level) ? (R8_PWM_POLAR |= (CH_PWM4)) : (R8_PWM_POLAR &= ~(CH_PWM4));
对比现有例程不免发现占空比与本函数有关*((volatile uint8_t *)((&R8_PWM4_DATA) + i)) = da;对于16位的PWM根据手册的描述程序需要做如下修改;
*((volatile uint32_t *)((&R32_PWM4_7_DATA) + i)
再结合时钟周期计算公式,16位PWM和8位的时钟周期数的选择是不一样的;16位的时钟周期计算是:RB_PWM_CYC_VALUE;在手册服务器托管网中可以找到这个寄存器的说明:
占空比计算:*((volatile uint32_t *)((&R32_PWM4_7_DATA) + i)) /R32_PWM_REG_CYCLE
具体使用配置如下:
PWMX_CLKCfg(1); PWMX_CycleCfg(PWMX_Cycle_32); { (Low_Level) ? (R8_PWM_POLAR |= (CH_PWM4)) : (R8_PWM_POLAR &= ~(CH_PWM4)); for(i = 0; i 8; i++) { if((CH_PWM4 >> i) & 1) { *((volatile uint32_t *)((&R32_PWM4_7_DATA) + i)) = 30; } } R32_PWM_REG_CYCLE = 60; R8_PWM_OUT_EN |服务器托管网= (CH_PWM4); }
实测效果:
如有问题请指正。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
一、setState 1. setState 更新状态的 2 种写法 对象式的 setState 语法:setState(stateChange, [callback]) (1)stateChange 为状态改变对象(该对象可以体现出状态的更改) (2)cal…