hpwm.h
#ifndef __HPWM_H
#define __HPWM_H
#include "STC8a8k.h"
void HPWM_Init();
/
//第一个参数,是PWM的通道,0----P20产生PWM,1--P21, ,2--P22, 3---P23
//第二个参数,是PWM的频率,电机一般是7000-10000的频率就行了,这里我选择的是8000,如果是舵机控制,这里可以是50hz
//第三个参数,是占空比,这里是高电平的占空比,范围是0--1,占空比比例越大,电机速度越快。
void HPWM_Set(int PWMchannel, unsigned int f,float zkb);
#endif
HPWM.c
#include "hpwm.h"
///
void HPWM_Init()
{
//访问PWM在扩展RAM区的特殊功能寄存器,置1
//0:是扩展RAM,XRAM
// P_SW2|=0x80;//必须加这句,将PSW2寄存器的bit7位置1
P_SW2=0x80;
//管脚切换+初始高电平,参考stc官方例程
PWM0CR = 0xc0;
PWM1CR = 0xc0;
PWM2CR = 0xc0;
PWM3CR = 0xc0;
P_SW2=0x00;
P_SW2=0x80;
PWMCKS=0X0b;//设置PWM周期=系统时钟/12=11.0592mhz/12;
PWMC=0x1000; //设置PWM周期为1000H个PWM时钟
//PWM配置寄存器
PWMCFG = 0x00;
P_SW2 =0x00;
// PWMCR |= 0x80; //使能PWM模块
PWMCR=0x80;
}
//******************************************
void HPWM_Set(int PWMchannel, unsigned int f,float zkb)
{
unsigned int CycleTime;
P_SW2=0x80;
CycleTime=(unsigned int)(9216/(f*0.01));//根据频率,计算周期,频率的倒数,设置计数周期
PWMC=CycleTime; //设置PWM周期为1000H个PWM时钟
switch(PWMchannel)
{
case 0:
PWM0T1 =zkb*CycleTime; //
PWM0T2 = 0;
break;
case 1:
PWM1T1 =zkb*CycleTime; //
PWM1T2 = 0;//当计数到CYCLE的时候,会归0
break;
case 2:
PWM2T1 =zkb*CycleTime; //
PWM2T2 =0; //当计数到CYCLE的时候,会归0
break;
case 3:
PWM3T1 =zkb*CycleTime; //占空比为(T2-T1)/cycle=zkb
PWM3T2 = 0;//当计数到CYCLE的时候,会归0
break;
default:break;
}
//将P_SW2的b7清0,从xram执行
PWMCR |= 0x80; //使能PWM模块
// P_SW2 &=~0x80;
P_SW2=0x00;
}