怎样用VHDL语言实现PWM波的占空比可调

怎样用VHDL语言实现PWM波的占空比可调,第1张

设计个计数器,以T=n为周期,到n后重新从0开始计数,同时产生脉冲,使输出PWM的管脚电平取反。在0-n之间再取个数,当计数值N=d时也产生一个脉冲使得PWM管脚取反。d/n就是占空比,n固定,改变d就可以改变占空比,分辨率为1/n。

给个参考思路吧。。。很久没用VHDL了,不能编出现成的了。

ORG 00H

AJMP GO

ORG 0BH

AJMP TIME0_1

ORG 30H

GO:

MOV SP,#60H

MOV TMOD,#01H

MOV TH0,#0B0H

MOV TL0,#3CH ;50MS

MOV R5,#5 ;中断间隔计次

MOV R6,#2 ;2中断为100MS

MOV R7,#0 ;取表序号数

LOOP:

MOV DPTR,#TAB

MOV A,R7

MOVC A,@A+DPTR

MOV P3,A

AJMP LOOP

TIME0_1:

PUSH ACC

DJNZ R6,RTT

MOV R6,#2 ;2次中断为100ms

INC R7 ;取表加1

DJNZ R5,RTT ;中断间隔次5次,2次为高电平,3次低电平,40%占空比

MOV R5,#5

MOV R7,#0

RTT:

POP ACC

RETI

TAB:

DB 80H,80H,00H,00H,00H

END

我有一个可以借鉴一下:

//

// 利用定时器控制产生占空比可变的 PWM 波

// 按K5,PWM值增加,则占空比减小,LED 灯渐暗。

// 按K6,PWM值减小,则占空比增加,LED 灯渐亮。

// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。

//

#include < reg51h >

#include < intrinsh >

sbit K5 =P3^2 ; //增加键

sbit K6 =P3^3 ; //减少键

sbit BEEP =P3^7 ; //蜂鸣器

unsigned char PWM=0x7f ; //赋初值

void Beep();

void delayms(unsigned char ms);

//

void main()

{

P2=0xff;

TMOD=0x21 ;

TH0=0xfc ; //1ms延时常数 12M

TL0=0x18 ; //频率调节

// TH1=PWM ; //脉宽调节

// TL1=0 ;

EA=1;

ET0=1;

ET1=1;

TR0=1 ;

while(1)

{

do{

if(PWM!=0xff)

{PWM++ ;delayms(10);}

else Beep() ;

}

while(K5==0);

do{

if(PWM!=0x00)

{PWM-- ;delayms(10);}

else Beep() ;

}

while(K6==0);

}

}

//

// 定时器0中断服务程序

//

void timer0() interrupt 1

{

// TR1=0 ;

TH0=0xfc ;

TL0=0x66 ;

TR1=1 ;

P2=0x00 ; //启动输出

}

//

// 定时器1中断服务程序

//

void timer1() interrupt 3

{

TH1=PWM ; //用定时器的方式2,是数据重装TH-TL中,改变PWM的值即该变定时器的初值

TR1=0 ;

P2=0xff ; //结束输出

}

//

//蜂鸣器子程序

//

void Beep()

{

unsigned char i ;

for (i=0 ;i<100 ;i++)

{

delayms(2) ;

BEEP=!BEEP ; //Beep取反

}

BEEP=1 ; //关闭蜂鸣器

delayms(100);

}

//

// 延时子程序

//

void delayms(unsigned char ms)

{

unsigned char i ;

while(ms--)

{

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

}

}

//

你想让输出口是P1^7,我这用的是P2口为输出,将其变化一下即可,希望对你有用!!!!!!!

STC单片机程序怎么调整PWM的空占比,在初始化函数中 对 PWM 进行初始化后 就会有按照初始化的 占空比输出了,需要调整占空比只要 PWM0 改变 CCAP0H 的值,PWM1 改变 CCAP1H 的值,就可以了,如果不断地 改变 CCAPxH 的数字 PWMx 的输出 也会不断地 改变。

#include "reg52h"

unsigned char count; //05ms次数标识

sbit pwm =P2^7 ; //PWM信号输出

sbit jia =P2^4; //角度增加按键检测IO口

sbit jan =P2^5; //角度减少按键检测IO口

unsigned char jd; //角度标识

void delay(unsigned char i)//延时

{

unsigned char j,k;

for(j=i;j>0;j--)

for(k=125;k>0;k--);

}

void Time0_Init() //定时器初始化

{

TMOD = 0x01; //定时器0工作在方式1

IE = 0x82;

TH0 = 0xfe;

TL0 = 0x33; //110592MZ晶振,05ms

TR0=1; //定时器开始

}

void Time0_Int() interrupt 1 //中断程序

{

TH0 = 0xfe; //重新赋值

TL0 = 0x33;

if(count< jd) //判断05ms次数是否小于角度标识

pwm=1; //确实小于,PWM输出高电平

else

pwm=0; //大于则输出低电平

count=(count+1); //05ms次数加1

count=count%40; //次数始终保持为40 即保持周期为20ms

}

void keyscan() //按键扫描

{

if(jia==0) //角度增加按键是否按下

{

delay(10); //按下延时,消抖

if(jia==0) //确实按下

{

jd++; //角度标识加1

count=0; //按键按下 则20ms周期从新开始

if(jd==6)

jd=5; //已经是180度,则保持

while(jia==0); //等待按键放开

}

}

if(jan==0) //角度减小按键是否按下

{

delay(10);

if(jan==0)

{

jd--; //角度标识减1

count=0;

if(jd==0)

jd=1; //已经是0度,则保持

while(jan==0);

}

}

}

void main()

{

jd=1;

count=0;

Time0_Init();

while(1)

{

keyscan(); //按键扫描

}

}

以上就是关于怎样用VHDL语言实现PWM波的占空比可调全部的内容,包括:怎样用VHDL语言实现PWM波的占空比可调、用汇编语言调节电机速度,用占空比调速,请给我个程序(汇编的)谢谢啦!、利用单片机定时器产生的占空比可调的PWM程序,采用C51(AT89s51)编写的C语言程序,输出口为P1.7等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10173849.html

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

发表评论

登录后才能评论

评论列表(0条)

保存