/* =======直流电机的PWM速度控制程序======== */
/* 晶振采用11.0592M,产生的PWM的频率约为91Hz */
#include<reg51.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sbit en1=P1^0/* L298的Enable A */
sbit s1=P1^2/* L298的Input 1 */
sbit s2=P1^3/* L298的Input 2 */
uchar t=0/* 中断计数器 */
uchar m1=0/* 电机1速度值 */
uchar tmp1,tmp2/* 电机当前速度则枝值 */
/* 电机控制函数 index-电机号(1,2)speed-电机速度(-100—100) */
void motor(uchar index, char speed)
{
if(speed>=-100 &&speed<=100)
{
if(index==1) /* 电机1的处理 */
{
m1=abs(speed)/* 取速度的绝对值 */
if(speed<0) /* 速度值为负则反转 */
{
s1=0
s2=1
}
else /* 不为负数孙锋敏则正转 */
{
s1=1
s2=0
}
}
}
}
void delay(uint j) /* 简易延时函数 */
{
for(jj>0j--)
}
void main()
{
uchar i
TMOD=0x02/* 设定T0的工基裤作模式为2 */
TH0=0x9B/* 装入定时器的初值 */ 定时101us
TL0=0x9B
EA=1/* 开中断 */
ET0=1/* 定时器0允许中断 */
TR0=1/* 启动定时器0 */
while(1) /* 电机实际控制演示 */
{
for(i=0i<=100i++) /* 正转加速 */
{
motor(1,i)
delay(5000)
}
for(i=100i>0i--) /* 正转减速 */
{
motor(1,i)
delay(5000)
}
for(i=0i<=100i++) /* 反转加速 */
{
motor(1,-i)
delay(5000)
}
for(i=100i>0i--) /* 反转减速 */
{
motor(1,-i)
delay(5000)
}
}
}
void timer0() interrupt 1 /* T0中断服务程序 */
{
if(t==0) /* 1个PWM周期完成后才会接受新数值 */
{
tmp1=m1
tmp2=m2
}
if(t<tmp1) en1=1else en1=0/* 产生电机1的PWM信号 */
t++
if(t>=100) t=0/* 1个PWM信号由100次中断产生 */
}
#include<reg51.h> // 这是 可以调节 占空比的sbit P1_0 = P1^0 // 三路PWM输出
sbit P1_1 = P1^1
sbit P1_2 = P1^2
sbit key10 = P3^2 // 6 个 按键 三路 + 或者 -
sbit key11 = P3^3
sbit key20 = P3^4
sbit key21 = P3^5
sbit key30 = P3^7
sbit key31 = P3^1
unsigned char Set_PWM0 = 2// 占空比调整
unsigned char Set_PWM1 = 5
unsigned char Set_PWM2 = 8
unsigned char counter = 0 // 计数的
bit bdata tt1,tt2,tt3 // 标志位
void main()
{
TMOD=0x01
TH0=(65536-2000)/256 // 定时时间 可以修改
TL0=(65536-2000)%256
EA=1
ET0=1
TR0=1
while(1)
{ // 开关调整 PWM 占空晌锋比
if(key10==0 &&tt1==0) {tt1 = 1Set_PWM0++} // K1、K2
if(key11==0 &&tt1==0) {tt1 = 1Set_PWM0--}
if(key10==1 &&key11==1) tt1=0
if(key20==0 &&tt2==0) {tt2 = 1Set_PWM1++} // K3、K4
if(key21==0 &&tt2==0) {tt2 = 1Set_PWM1--}
if(key20==1 &&key21==1) tt2=0
if(key30==0 &&tt3==0) {tt3 = 1Set_PWM2++} /袜伏/ K5、K6
if(key31==0 &&tt3==0) {tt3 = 1Set_PWM2--}
if(key30==1 &&key31==1) tt3=0
}
}
void Timer0(void) interrupt 1 // 定时器0 PWM 控制
{
TH0=(65536-2000)/256 // 定时时间 可宴好晌以修改
TL0=(65536-2000)%256
counter++
if(counter >= 16) counter = 0 // PWM 16级 可以修改
if(counter >= Set_PWM0) P1_0 = 0else P1_0 = 1
if(counter >= Set_PWM1) P1_1 = 0else P1_1 = 1
if(counter >= Set_PWM2) P1_2 = 0else P1_2 = 1
}
#ifndef __PWM__H__#define __PWM__H__
void pwm_ccp1(unsigned char a,unsigned char b)
void pwm_ccp2(unsigned char a,unsigned char b)
#endif
void pwm_ccp1(unsigned char a,unsigned char b)//左边PWM
//CCP1 模块的 PWM 工作方式,周期为(b+1)*4*Tosc*(TMR2前分频值败消尘)=b+1 us //pwm高电平=a:CCP1CON(第四五位)Tosc*(TMR2前分频值)
//pwm高电平=a:CCP1CON(第四五位)Tosc*(TMR2前分频值)
{//a>b时有最高转速
CCPR1L=a //* 设置工作循环的高 8bit 为 a
CCP1CON=0X0C //0000 1100 设置 CCP1 为 PWM 工作方式,且工作循环的低 bit2 为 11*/
CCP1IE=0//* 禁止总中断和外围中断 */
PR2=b //* 设置 PWM 周期 */
TRISC2=0 //* 设置 RC2/CCP1 为输出 */
T2CON=0X04 //* 0000 1000前分频比为 1:1 ,后分察禅频器1:2,打开 TMR2 ,同时输出 PWM 信号 */
}
void pwm_ccp2(unsigned char a,unsigned char b) //右边PWM
//CCP2 模块的 PWM 工作方式,周期为(b+1)*4*Tosc*(TMR2前分频值),
//pwm高电平=a:CCP2CON(第四五位)Tosc*(TMR2前分频值)
{
CCPR2L=a //* 设置工作循环的高 8bit 为 a
CCP2CON=0X0C //* 设置 CCP2 为 PWM 工作方式,桥宏且工作循环的低 bit2 为 11*/
CCP2IE=0 //* 中断屏蔽
PR2=b //* 设置 PWM 周期 */
TRISC1=0 //* 设置 RC1/CCP2 为输出 */
T2CON=0X04 //* 前分频比为 1 ,打开 TMR2 ,同时输出 PWM 信号 */
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)