hpwm.h头文件和hpwm.c文件,分别复制,保存成hpwm.h文件和hpwm.c文件,就能使用

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;
}
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值