设计个计数器,以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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)