用STC12单片机内部PWM产生脉冲方波(直流电机调速/正反转)

这个程序是以前比赛时候准备的,方便用来调电机转速,也可作呼吸灯等。采用的是mx1508数字芯片作为直流电机驱动板,可双路输出。感觉比纯模拟电路的mos管好用还便宜。

IN1和IN2是控制端(电机A) ,控制高低电平可以来控制正反转。没有调速端口。一个方案是在供电端给不同pwm进行调速,可io供电能力有限,速度可能会慢。所以另一个方案就是一个输入端口给pwm,改变电平;另一端输入口给固定电平就可以进行调速。

stc12c5a60s2内部有2个pwm输出io口。根据芯片手册可知。

具体寄存器配置请多多自行参照手册。学会理解别人代码进行自学。这样才能进步。我记得这个pwm模块程序也是我上网查改的。

#include <STC12C5A60S2.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
void pwm_init() //PWM初始化函数,初始占空比为0
{
	CMOD=0x02;	//0000 0010 空闲时不计数,不产生中断,时钟源为fosc/2,因此输出占用率为fosc/512
	CL=0x00;
	CH=0x00;
	CCAPM0=0x42; //0100 0010, 8位 PWM
	CCAP0L=0x00;
	CCAP0H=0x00; //PWM实现方法,因为是8位,CL基础计数器从0xFF递减到0x00,溢出后将CCAP0H的值加载到CCAP0L,若CL递减过程中,若大于CCAP0L,则输出高电平,否则为低电平
	CCAPM1=0x42;
	CCAP1H=0x00;
	CCAP1L=0x00;
	CR = 1;	  //开启PCA计数器
}
void pwm_set(uchar x,uchar y) //占空比设置函数   引脚为P1.3和P1.4
{
		CCAP0H=x*2.55;    //占空比公式D=(256-CCAPnH)/ 256(8位PWM模式)
		CCAP0L=x*2.55;		//乘2.55转换为0-100%
		CCAP1H=y*2.55;
		CCAP1L=y*2.55;
}
void main()
{
	pwm_init();
	while(1)
	{
	pwm_set(0,20);    //数值反放则电机方向反转 (20,0);
	}
}

 这里还有一篇《利用单片机内部定时器产生pwm进行led呼吸灯调光》:https://blog.csdn.net/zy19981110/article/details/89447173

猜你喜欢

转载自blog.csdn.net/zy19981110/article/details/89446812