STC12C5A60S2单片机控制直流电机,可以进行正转、反转和相应的加减速,亲测有效。
程序源码如下:
#include "STC12C5A60S2.h"
#define uint unsigned int
#define uchar unsigned char
sbit forward_up=P3^5; //正转加速
sbit forward_down=P3^4; //正转减速
sbit reversal_up=P3^3;//反转加速
sbit reversal_down=P3^2;//反转减速
sbit In1=P0^0;
sbit In2=P0^1;
sbit In3=P0^2;
sbit In4=P0^3;
void DelayMs(uchar ms);
void init_PWM(); //PWM 初始化
void PWM0_change(uchar type,uchar change);//PWM调整函数
void PWM0_set(uchar empty);//直接赋PWM的值
void turnback();//反转
void run();//正转
void stop();//停止
//stc10f系列 单周期指令的ms级延时
void DelayMs(uchar ms) //这个延时可能不对,非关键部分,可自己修改
{
uint i; while(ms--)
{
for(i = 0; i < 850; i++);
}
}
void init_PWM()
{
CCON=0X00;
CH=0;
CL=0;
//时钟分频也就是输出的频率。 0X00:以系统时钟/12 为时钟源,0X02:系统时钟/2,0x08:系统时钟
CMOD=0X02;
//起始占空比,0XC0:占空比为25%,0X80:占空比为50%,0X40:占空比为75%
PWM0_set(0XC0); // (与CL比较,当CL<CCAP0L时输出低电平,反之高电平)
PCA_PWM1=0x00;
PCA_PWM0=0x00; //控制占空比的第九位为0
//0X42:8位PWM P1.3输出, P1.4输出,无中断;0X53:8位PWM输出,下降沿产生中断;
//0X63:上升沿产生中断;0X73:跳变沿产生中断
CCAPM0=0X42;
CCAPM1=0X42;
CR=1; //计时器开始工作
}
void PWM0_set(uchar empty) //直接设置占空比
{
CCAP0L=empty;
CCAP0H=empty;
CCAP1L=empty;
CCAP1H=empty;
}
//占空比调节函数
void PWM0_change(uchar type,uchar change) //type=0减占空比,1增加占空比
//change: 0X0C 约5%,0X05约2%
{
if(type==0)
{
if(CCAP0L<0XE6) //<90%
{
CCAP0L+=change;
CCAP0H+=change;
CCAP1L+=change;
CCAP1H+=change;
}
}
else
{
if(CCAP0L>0X19) //>10%
{
CCAP0L-=change;
CCAP0H-=change;
CCAP1L-=change;
CCAP1H-=change;
}
}
}
void main()
{
init_PWM(); //初始化,PWM输出
while(1)
{
if(forward_up==0) //按键加PWM占空比
{
DelayMs(500); //按键消抖
while(forward_up==0); //按键释放才跳出执行下一步
PWM0_change(1,0X0c); //change: 0X0C 约5%,0X05约2%
run();
}
if(forward_down==0)//按键减PWM占空比
{
DelayMs(500);
while(forward_down==0);
PWM0_change(0,0X0c); //change: 0X0C 约5%,0X05约2%
run();
}
if(reversal_up==0) //按键加PWM占空比
{
DelayMs(500); //按键消抖
while(reversal_up==0); //按键释放才跳出执行下一步
PWM0_change(1,0X0c); //change: 0X0C 约5%,0X05约2%
turnback();
}
if(reversal_down==0)//按键减PWM占空比
{
DelayMs(500);
while(reversal_down==0);
PWM0_change(0,0X0c); //change: 0X0C 约5%,0X05约2%
turnback();
}
}
}
void turnback()
{
In1=0;In2=1;In3=0;In4=1;
}
void run()
{
In1=1;In2=0;In3=1;In4=0;
}
void stop()
{
In1=1;In2=1;In3=1;In4=1;
}
全部程序51hei下载地址:
PWM直流电机调速.rar
(28.62 KB, 下载次数: 63)
|