谁能给解释一下这个pwm程序 怎么输出波形 和调速的?给加100分

谁能给解释一下这个pwm程序 怎么输出波形 和调速的?给加100分,第1张

给你个用C语言编的,可读性强,可移植性高。

/* =======直流电机的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 信号 */

}


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

原文地址: http://outofmemory.cn/yw/12430359.html

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

发表评论

登录后才能评论

评论列表(0条)

保存