这是利用L298驱动运塌两个直流电机的(来源于智能车循迹)程序,/* =======直流电机的PWM速度控制程序======== */
/* 晶振采用11.0592M,产生的PWM的频率约为91Hz */
#include&ltreg51.h&gt
#include&ltmath.h&gt
#define uchar unsigned char
#define uint unsigned int
sbit en1=P1^0/* L298的Enable A */
sbit en2=P1^1/* L298的Enable B */
sbit s1=P1^2/* L298的Input 1 */
sbit s2=P1^3/* L298的Input 2 */
sbit s3=P1^4/* L298的Input 3 */
sbit s4=P1^5/* L298的Input 4 */
uchar t=0/* 中断计数器 */
uchar m1=0/* 电机1速度值 */
uchar m2=0/* 电机2速度值 */
uchar tmp1,tmp2/* 电机当前速度值 */
/* 电机控制函数 index-电机号(1,2)speed-电机速度(-100—100) */
void motor(uchar index, char speed)
{
if(speed&gt=-100 &amp&ampspeed&lt=100)
{
if(index==1) /* 电机1的处理 */
{
m1=abs(speed)/* 取速度的绝对值 */
if(speed&lt0) /* 速度值为负则反转 */
{
s1=0
s2=1
}
else /* 不为负数则正转 */
{
s1=1
s2=0
}
}
if(index==2) /* 电机2的处理 */
{
m2=abs(speed)/* 电机2的速度控制 */
if(speed&lt0) /* 电机2的方向控制 */
{
s3=0
s4=1
}
else
{
s3=1
s4=0
}
}
}
}
void delay(uint j) /* 简易延时函数 */
{
for(jj&gt0j--)
}
void main()
{
uchar i
TMOD=0x02/* 设定T0的工作模式为2 */
TH0=0x9B/* 装入定时器的初值颤悄笑 */
TL0=0x9B
EA=1/* 开中断 */
ET0=1/* 定时器0允许中断 */
TR0=1/* 启动定时器0 */
while(1) /* 电机实际控制演示 */
{
for(i=0i&lt=100i++) /* 正转加速 */
{
motor(1,i)
motor(2,i)
delay(5000)
}
for(i=100i&gt0i--) /* 正转减速 */
{
motor(1,i)
motor(2,i)
delay(5000)
}
for(i=0i&lt=100i++) /* 反转加速 */
{
motor(1,-i)
motor(2,-i)
delay(5000)
}
for(i=100i&gt0i--) /* 反转减速 */
{
motor(1,-i)
motor(2,-i)
delay(5000)
}
}
}
void timer0() interrupt 1 /* T0中断服务程茄含序 */
{
if(t==0) /* 1个PWM周期完成后才会接受新数值 */
{
tmp1=m1
tmp2=m2
}
if(t&lttmp1) en1=1else en1=0/* 产生电机1的PWM信号 */
if(t&lttmp2) en2=1else en2=0/* 产生电机2的PWM信号 */
t++
if(t&gt=100) t=0/* 1个PWM信号由100次中断产生 */
#include <avr/io.h>void main(void)
{
PORTB=0x00
DDRB=0x0E
// T/C1 初始化
TCCR1A=0xA1
TCCR1B=0x09 //匹配时清零,TOP:255,频率:8M/256=31.25K
OCR1A=85 //占空比:1/3
OCR1B=128 /御指/占空比:1/2
// T/C2 初始化
TCCR2=0x69 //匹配时清零,TOP:255,频率:31.25K
OCR2=170 //占空比:2/3
while (1)
}
使用M16产生扮拆局三路PWM的程序,厅让参考一下基本OK
还有个是可调节的PWM程序,我做过仿真了,需要全部留下邮箱传给你
/*****************************************************
#define KEY PINC.0
#define PWMA PORTB.3 //17号脚
#define PWMB PORTB.4 //18号脚
#include <mega8.h>
#include <delay.h>
#include <math.h>
unsigned int m=0
unsigned char xiangxian=0
bit INIT2=0//判断是否象限2已经初始化;
bit INIT3=0
bit INIT4=0
/*下面为四个象限中处理函数,参数为45度平分为255段角度*/
inline panduan()
{
if(m<=255)
{
xiangxian=1
}
else if((m>255)&&(m<511))
{
xiangxian=2
if(m==256)
{
INIT2=1
PWMA=0
OCR1A=0x00
OCR1B=0xff
PWMB=1
}
}
else if((m>=511)&&(m<767))
{
xiangxian=3
}
else if((m>=767)&&(m<1024))
{
xiangxian=4
}
else if(m>1024)
{
m=0
}
}
void xiangxian1(unsigned char degree)
{
PWMA=0
PWMB=0
OCR1BL=m
OCR1AL=255-m
}
void xiangxian2(unsigned char degree)
{ unsigned char temp
temp=m-255
OCR1AL=temp
OCR1BL=temp
}
void xiangxian3(unsigned char degree)
{
unsigned char temp
temp=m-511
PWMA=1
PWMB=1
OCR1BL=255-temp
OCR1AL=temp
}
void xiangxian4(unsigned char degree)
{unsigned char temp=0
temp=m-767
PWMA=1
PWMB=0
OCR1BL=255-temp
OCR1AL=255-temp
}
/*角度计算函数,负责计算在各个象限中角度对应的PWM输出*/
void SET_ANGLE( unsigned char degree)
{
switch (xiangxian)
{
case 1: xiangxian1(degree)break
case 2: xiangxian2(degree)break
case 3: xiangxian3(degree)break
case 4: xiangxian4(degree)break
default:break
}
}
void main(void)
{
unsigned char temp
unsigned char xiangxian=0
// Declare your local variables here
PORTB=0x187
DDRB=0x1e
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=P
PORTC=0x01
DDRC=0x00
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=0 State1=T State0=T
PORTD=0x00
DDRD=0x04
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00
TCNT0=0x00
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000.000 kHz
// Mode: Fast PWM top=01FFh
// OC1A output: Inverted
// OC1B output: Inverted
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xF1
TCCR1B=0x01
TCNT1H=0x00
TCNT1L=0x00
ICR1H=0x00
ICR1L=0x00
OCR1AH=0x00
OCR1AL=0x00
OCR1BH=0x00
OCR1BL=0x00
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00
TCCR2=0x00
TCNT2=0x00
OCR2=0x00
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80
SFIOR=0x00
PWMA=0
PWMB=0
OCR1AL=0xff
OCR1BL=0x00
while (1)
{
if(KEY==0)
{
delay_ms(20)
if(KEY==0)
{
m=m+1
panduan()
SET_ANGLE(m)
PORTD.2=!PORTD.2
}
}
}
}
1、既然严格互补,最佳办法当然是输出1路,经过反相器得到另一路了。2、如果用单片机控制。那么帆早氏,你应该用端口态散8位同时赋值。另外,就是你程序上的问题才会造成没睁喊有达到理想的(占空比之和不为1)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)