8H 需要一个15位或16位PWM 输出任意频率任意占空比的程序
需要用8H1K08或者 8H1K28 单片机,15位或16位分辨率的PWM 输出, 任意频率 任意占空比的程序,需要用单片机内置的PWM硬件产生波形。
我找了规格书的例程,按下面图片这个例程修改了一下,只能10位分辨率的输出,
我往PWMA1_CCR1,写入16位数据,都是只有10位分辨率的输出,
写入数值超过1023就100%了。
请教还有哪里要设置 才能有15位或16位?12位也行。
PWMA_PS=0xF0;//P10输出PWMA1P, P11输出PWMA1N,
PWMA_CCER1=0x00; //写CCMRx 前必须先清零CCERx 关闭通道
PWMA_CCMR1=0x68; //设置CC1 为PWMA输出模式 ,寄存器预装载
PWMA_CCER1=0x01; //使能CC1 通道
PWMA_CCR1=100; //设置占空比时间
PWMA_ARR=500; //设置周期时间
PWMA_ENO=0x01; //使能PWM1P 端口输出 、
PWMA_BKR=0x80; //使能主输出
PWMA_CR1=0x01; //开始计时
如图 ARR是控制周期的
CCR1控制的是占空比
频率和分辨率是互相牵制的关系
如果频率较高,那么分辨率就做不了很高
如果分辨率较高,那么频率就没法做到很高
使用PWMA_ARR = 0xffff;即可实现16位的分辨率,但此时的频率就比较低了
占空比则是使用PWMA_CCR1来控制,范围是0~PWMA_ARR 代码的解释很清楚的:
PWMA_CCR1=100; //设置占空比时间
PWMA_ARR=500; //设置周期时间
你只设置CCR1,不改ARR,则PWM周期或频率不变,最大占空比100%,超过了不管给多大的值,都是100%!
你要先根据PWM周期或频率,计算ARR,然后再根据占空比计算CCR1。
#define FOSC 40000000UL
u32 frequency, period;//PWM频率、周期
float duty; //占空比, 0.0~1.0
u16 pscr; //前置分频 0~65535
u16 load_period;//装载的PWM周期数(PWM时钟数)
u16 load_duty; //装载的PWM占空比(PWM时钟数)
period = FOSC / frequency;//由PWM频率计算PWM周期
pscr = (u16)(period / 65536UL);//计算分频系数
load_period = (u16)(period / (pscr+1)); //计算装载周期值. 当period >= 65536, 则load_period在32768~65535之间,尽量得到最精确的数值。
load_duty = (u16)((float)load_period * duty);//计算装载占空比值, duty为占空比0.0~1.0.
PWMA_PSCR = pscr; // 预分频寄存器
PWMA_ARR = load_period;//设置周期时间
PWMA_CCR1 = load_duty; //设置占空比时间
页:
[1]