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)
2020-11-24 09:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|