单片机利用pwm控制电机,L298N有四个输入端,两个使能端,怎么产生两路pwm波?

单片机利用pwm控制电机,L298N有四个输入端,两个使能端,怎么产生两路pwm波?,第1张

这是利用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)。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12556337.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存