CCS软件C语言编程输出SPWM脉宽调制波控制感应电机转速程序算法解读

CCS软件C语言编程输出SPWM脉宽调制波控制感应电机转速程序算法解读,第1张

1、PWM波是控制直流电机的

通俗的说,5V直流电机在5V的情伏乱弊况下肯陪晌定速度最快,在0V的情况下肯定不转了

这样电源0~5V就对应了不同的速度

问题是怎么才能实现0~5V的变化呢?

于是就用PWM波控制mos管来给直流电机供电。PWM就是一个矩形波,通过控制高电平和低电平的时间来控制MOS管导通的时间。MOS管在高电平的时候导通,就相当于5V电源直接加到电机上;MOS管在低电平的时候截止,就相当于0V电源加到电机上缺族。

PWM又叫脉宽调制,就是控制高电平占一个周期的比例。而这个PWM波就是控制5V电源加到电机上的时间,从而控制了电机。

2、例程:

#include <reg52.h>

sbit KEY1 = P3^4

sbit PWM = P1^5

unsigned char CYCLE//定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms

unsigned char PWM_ON //定义高电平时间

void delay(unsigned int cnt)

{

while(--cnt)

}

main()

{

unsigned char PWM_Num//定义档位

TMOD |=0x01//定时器设置 1ms in 12M crystal

TH0=(65536-1000)/256

TL0=(65536-1000)%256//定时1mS

IE= 0x82//打开中断

TR0=1

CYCLE = 10// 时间可以调整 这个是10步调整 周期10ms 8位PWM就是256步

while(1)

{

if(!KEY1)

{

delay(10000)

if(!KEY1)

{

PWM_Num++

if(PWM_Num==4)PWM_Num=0

switch(PWM_Num){

case 0:P0=0x06PWM_ON=0break//高电平时长

case 1:P0=0x5BPWM_ON=4break

case 2:P0=0x4FPWM_ON=6break

case 3:P0=0x66PWM_ON=8break

default:break

}

}

}

}

}

/********************************/

/* 定时中断 */

/********************************/

void tim(void) interrupt 1 using 1

{

static unsigned char count//

TH0=(65536-1000)/256

TL0=(65536-1000)%256//定时1mS

if (count==PWM_ON)

{

PWM = 1//灯灭

}

count++

if(count == CYCLE)

{

count=0

if(PWM_ON!=0) //如果左右时间是0 保持原来状态

PWM = 0//灯亮

}

/*********************************************************

// 载波比选为N=24,调制比M=Uc/Ur=1,晶振频率12M

// 正弦波频率50Hz

// 高电平的宽度Tpw = Tt/2*(1+Msimwt)

// 低电平的宽度Tpw = Tt/2*(1-Msimwt)

// Tt周期

// T2是产生SPWM波形,并从P1^1输出,用导线连接到P3.4作为测试频率使用。

// T1工物雀作在定时方式1,定时1s

// T0工作在计数方式,对输入的脉冲进行计数,溢出产生中断。

// 16位计数器最大值是65536,1s内可能会产生多次溢出,所以在中断处理程序对中断的次数进行

// 计数。1s到后,将中断的计数器里的计数值取出进行综合处理,处理后的数据送显示。

//信号频率的计算方法:

// T0工作在计悄薯数方式,假设1s内溢出C1次,最后未溢出的计数值是C2,则频率公式为:

// F=C1*2^16+C2 = C1*65536+TH0*256+TL0)

//使用12MHz时钟,测量的最大范围是不大于500KHz。启蚂者

*********************************************************/

#include "reg52.h"

#define uchar unsigned char

#define uint unsigned int

uchar disp[8]={0,0,0,0,0,0,0,0}

uchar FreStr[]="Friquency is:"

uchar T0count,T1count

uchar code x[]={66,38,26,89,15,97,7,102,2,103,1,102,2,

97,7,89,15,78,26,66,38,38,66,26,78,15,

89,7,97,2,102,1,103,1,103,2,102,7,97,15,

89,26,78,38,66}

uchar ky,kc,count=255

sbit L1=P1^1

void delayms(uchar ms)

{

uchar i

while(ms--)

{

for(i = 0 i <120 i++)

}

}

//LCD定义开始

//以下三个是定义LCD的引脚

sbit lcden=P0^5

sbit lcdwrite=P0^6

sbit lcdrs=P0^7

//延时程序

void delay(uint z)

{

uint x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

//lcd的写指令

void write_com(uchar com)

{

lcdrs=0

lcden=0

P2=com

delay(5)

lcden=1

delay(5)

lcden=0

}

//lcd的写数据

void write_data(uchar da)

{

lcdrs=1

lcden=0

P2=da

delay(5)

lcden=1

delay(5)

lcden=0

}

//初始化

void Lcd_init()

{

lcdwrite=0

lcden=0

write_com(0x38)//16*2显示,5*7点阵,8位数据

write_com(0x0c)//显示开,关光标

write_com(0x06)//移动光标

write_com(0x01)//清除LCD的显示内容

}

//LCD定义结束

//计算频率值

void calc()

{

uchar i

long frequency

frequency=(T0count*256+TH0)*256+TL0

for(i=7i>0i--)

{

disp[i]=frequency%10

frequency=frequency/10

}

disp[0]=frequency

}

void init()

{

T0count=0

T1count=0

TH0=0

TL0=0

}

void main()

{

uchar dis

init()

Lcd_init()

TMOD=0x15

TH1=(65536-5*110592/12)/256

TL1=(65536-5*110592/12)/256%10

ET1=1

ET0=1

EA=1

TR1=1

TR0=1

//以下四句的作用是在P1.1引脚上形成1000Hz的脉冲,用导线连接到P3.4作为测试用。将其中

//高8位和低8位的初始值更改后可输出不同频率的脉冲。

T2MOD = 0x02

TH2=255-x[ky]

TL2=255-x[ky]

ET2=1

EX0=1

TR2=1

L1=1

write_com(0x80)

for(dis=0dis<12dis++)

write_data(FreStr[dis])

while(1)

{

write_com(0xC0)

for(dis=0dis<8dis++)

write_data(disp[dis]+0x30)//显示频率

}

}

//计算输入脉冲的次数

void time0() interrupt 1

{

T0count++

}

//计算1s时间

void time1() interrupt 3

{

TH1=(65536-5*110592/12)/256

TL1=(65536-5*110592/12)/256%10

if(T1count==20)

{

calc()

init()

}

else T1count++

}

//这是产生SPWM波形、

void M() interrupt 5

{

TH2=255-x[ky]

TL2=255-x[ky]

kc++

if(kc==count)

{

kc=0

L1=~L1

ky++

if(ky==49) ky=0

}

}

//这是使用外部中断0可以调整输出波形的频率

void MM() interrupt 0

{

delayms(300)

if(INT0==0)

{

count=count-5

if(count==0) count=255

}

}

void

delay(uchar

i)

{

uint

x,y

for(x=ix>0x--)

for(y=100y>0y--)

}

void

main()

{

uchar

pwm

=

1,h

=

20

while(1)

{

RC3

=1

delay(pwm)

RC3

=

0

delay(h

-

pwm)

}

}

改变pwm的值(1-19),

就可以改变输凯中判出高盯改电平的宽度,还有其它的办法,这是培慧最简单的,软件延时


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存