❶ 关于PWM占空比调节的变成问题,有源程序请教!
递增,应有极限,不能从0再开始循环。
while(1) {
if(Key1 == 0) //判断是否K1键按下
{
Num++;
Delay10ms(1);
if(Num >= 9)
Num = 9; //我只是改了这一句
PWM_DA_Percent_change( PWM_Data[Num] ); //改变PWM的值
while(Key1 == 0); //等待按键抬起
}
}
❷ 51单片机测量PWM波的占空比的C语言程序
用定时器复产生程序如制下:
unsigned
int
a=0
,b=10;
void
main()
{
tmod=0x01;
th0=(65536-50000)/256;
tl0=(65536-50000)%256;
ea=1;
et0=1;
tr0=1;
}
void
pwm()
interrupt
1
{
th0=(65536-50000)/256;
tl0=(65536-50000)%256
;
a++;
p1^1=0;
if(a=20)
{
a=0;
}
if(a=b)
{
p1^1=1;
}
}
调节a
,b的值即可调节占空比,程序框架就是这样,具体自己改吧
❸ 求单片机输出占空比可调的PWM波程序
80S52没有硬件PWM功能,靠
定时器中断很简单,只不过频率不能太高,或调
节精度比较差
下面是双定时器产生PWM主要语句:
TMOD=0X11;
TH0=(65536-20000)/256;//
定时20ms
TL0=(65536-20000)%256;
TH1=(65536-b)/256;//定时要小于20ms,改变b的值即改变占空比
TL1=(65536-b)%256;
ET0=1;
EA=1;
TR0=1;
PWM=1;
b=2000;
while(1);
void
timer0()interrupt
1
{
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
PWM=1;
TR1=1;
ET1=1;
}
void
timer1()interrupt
3
{
TH1=(65536-b)/256;
TL1=(65536-b)%256;
PWM=0;
TR1=0;
ET1=0;
}
定时器0中断负责每
20ms将管脚置
1,定时1负责在20ms之内的某一时间将该管脚清0
当然也可以采用自动重装方式,中断可以更频繁一些,产生的PWM频率要高一些
也可以只用一个定时器,这时产生PWM波要么频率低,要么调节精度差,因中断一次至少10US,你就不用指望一次调节步距10us以下了
❹ 怎样用单片机STC 89C52实现pwm控制占空比的输出波形,求程序!能详细备注的最好!
PWMHDATA30H;高电平脉冲的个数
PWMDATA31H;PWM周期
COUNTERDATA32H
TEMPDATA33H
ORG0000H
AJMPMAIN
ORG000BH
AJMPINTT0
ORG0100H
MAIN:
MOVSP,#60H;给堆栈指针赋初值
MOVPWMH,#02H;
MOVCOUNTER,#01H
MOVPWM,#15H
MOVTMOD,#02H;定时器0在模式2下工作
MOVTL0,#38H;定时器每200us产生一次溢出
MOVTH0,#38H;自动重装的值
SETBET0;使能定时器0中断
SETBEA;使能总中断
SETBTR0;开始计时
KSCAN:
JNBP1.1,K1CHECK;扫描KEY1,
JNBP1.2,K2CHECK;扫描KEY2,如果按下KEY2,跳转到KEY2处理程序
SJMPKSCAN
K1CHECK:
JBP1.1,K1HANDLE;去抖动,如果按下KEY1,跳转到KEY1处理程序
SJMPK1CHECK
K1HANDLE:
MOVA,PWMH
CJNEA,PWM,K1H0;判断是否到达上边界
SJMPKSCAN;是,则不进行任何操作
K1H0:
MOVA,PWMH
INCA
CJNEA,PWM,K1H1;如果在加1后到达最大值
CLRTR0;定时器停止
SETBP1.0;P1.0为高电平
SJMPK1H2
K1H1:
CJNEA,#02H,K1H2;如果加1后到达下边界
SETBTR0;重开定时器
K1H2:
INCPWMH;增加占空比
SJMPKSCAN
K2CHECK:
JBP1.2,K2HANDLE;去抖动,如果按下KEY2,跳转到KEY2处理程序
SJMPK2CHECK
K2HANDLE:
MOVA,PWMH
CJNEA,#01H,K2H0;判断是否到达下边界
SJMPKSCAN;是,则不进行任何操作
K2H0:
MOVA,PWMH
MOVTEMP,PWM
DECA
CJNEA,#01H,K2H1;如果在减1后到达下边界
CLRTR0;定时器停止
CLRP1.0;P1.0为低电平
SJMPK2H2
K2H1:
DECTEMP
CJNEA,TEMP,K2H2;如果到达上边界
SETBTR0;启动定时器
K2H2:
DECPWMH;降低占空比
SJMPKSCAN
INTT0:
PUSHPSW;现场保护
PUSHACC
INCCOUNTER;计数值加1
MOVA,COUNTER
CJNEA,PWMH,INTT01;如果等于高电平脉冲数
CLRP1.0;P1.0变为低电平
INTT01:
CJNEA,PWM,INTT02;如果等于周期数
MOVCOUNTER,#01H;计数器复位
SETBP1.0;P1.0为高电平
INTT02:
POPACC;出栈
POPPSW
RETI
❺ 求MSP430单片机用两个按键控制PWM波占空比的程序!!!!谢谢啦!!!
//程序说明:使用内部内部时钟fosc/12产生周期为256us,占空比为25%的方波
#include<STC12C5616AD.h>
#define uchar unsigned char
#define uint unsigned int
sbit d1=P1^0;
sbit d2=P1^1;
void PWM_init()
{
CMOD=0x00;//PCA计数脉冲选择内部时钟fosc/02(0x02:fosc/2)
CL=0x00;//PCA赋初值
CH=0x00;
}
void PWM0(uchar ZKB)
{
CCAP0L=CCAP0H=ZKB;//255*(100-ZKB)/100;//占空比设置
// =;//255*(100-ZKB)/100;//CL由ff-00溢出时,CCAP0H的值装入CCAP0L
CCAPM0=0x42;// 8位PWM模式
CR=1; //开始计数
}
void PWM1(uchar ZKB) //高电平占得比例占空比为(Gao/255)
{
CCAP1H = CCAP1L = ZKB;//256-(int)(256/100)*Gao;
CCAPM1=0x42;// 8位PWM模式
CR=1;
}
void PWM2(uchar ZKB) //高电平占得比例占空比为(Gao/255)
{
CCAP2H = CCAP2L = ZKB;//256-(int)(256/100)*Gao;
CCAPM2=0x42;// 8位PWM模式
CR=1;
}
void PWM3(uchar ZKB) //高电平占得比例占空比为(Gao/255)
{
CCAP3H = CCAP3L = ZKB;//256-(int)(256/100)*Gao;
CCAPM3=0x42;// 8位PWM模式
CR=1;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
PWM_init();
while(1)
{
if(d1!=0)
{
PWM0(130);
PWM1(130);
PWM2(255);
PWM3(255);
}
if(d2==1)
{
PWM0(60);
PWM1(255);
PWM2(20);
PWM3(255);
delay(300);
}
i
}
}
若不是新手加上按键应该会的
❻ 跪求stc12c5a60s2单片机PWM程序。50%占空比。P1.3口输出PWM。
#include<STC12C5A60S2.H> //头文件
/*********************************************************************************************
函数名:PWM初始化函数
调 用:PWM_init();
参 数:无
返回值:无
结 果:将PCA初始化为PWM模式,初始占空比为0
备 注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可
/**********************************************************************************************/
void PWM_init (void){
CMOD=0x02; //设置PCA定时器
CL=0x00;
CH=0x00;
CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)
CCAP0L=0x00; //设置PWM0初始值与CCAP0H相同
CCAP0H=0x00; // PWM0初始时为0
//CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(使用时删除//)
//CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同
//CCAP1H=0x00; // PWM1初始时为0
//CCAPM2=0x42; //PWM2设置PCA工作方式为PWM方式
//CCAP2L=0x00; //设置PWM2初始值与CCAP0H相同
//CCAP2H=0x00; // PWM2初始时为0
//CCAPM3=0x42; //PWM3设置PCA工作方式为PWM方式
//CCAP3L=0x00; //设置PWM3初始值与CCAP0H相同
//CCAP3H=0x00; // PWM3初始时为0
CR=1; //启动PCA定时器
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:PWM0占空比设置函数
调 用:PWM0_set();
参 数:0x00~0xFF(亦可用0~255)
返回值:无
结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平
备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可
/**********************************************************************************************/
void PWM0_set (unsigned char a){
CCAP0L= a; //设置值直接写入CCAP0L
CCAP0H= a; //设置值直接写入CCAP0H
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:主函数
调 用:无
参 数:无
返回值:无
结 果:程序开始处,无限循环
备 注:
/**********************************************************************************************/
void main (void){
while(1){
PWM_init(); //PWM初始化
PWM0_set(0x7F); //设置PWM占空比,总共255,除以2,转换成十六进制得7F
}
}
/**********************************************************************************************/
❼ 求DSP产生可变占空比PWM波程序
用EVA事件管理器产生 重点看哈那张的内容 占空比有公式计算 自己动手做了才知道是怎么回事
/****************************************************************************
*
*文件名:EvPwm02.c
*
*功 能:PWM1和PWM2输出频率为1KHz的PWM波形。波形的占空比每隔1s变化5%,范围在10%
* 到90%之间。
*
*说 明:EVA下面的通用定时器T1工作于连续增/减计数模式,产生对称的PWM波形。通过
* T1的周期中断来计时,每隔1s钟改变1次占空比。死区时间为4.27us。
*
****************************************************************************/
#include "DSP28_Device.h"
#include "DSP28_Globalprototypes.h"
Uint32 intcount;
int increase;
int decrease;
/****************************************************************************
*
*名 称:main()
*
*功 能:初始化系统和各个外设
*
*入口参数:无
*
*出口参数:无
*
****************************************************************************/
void main(void)
{
InitSysCtrl(); //初始化系统函数
DINT;
IER = 0x0000; //禁止CPU中断
IFR = 0x0000; //清除CPU中断标志
InitPieCtrl(); //初始化PIE控制寄存器
InitPieVectTable(); //初始化PIE中断向量表
InitGpio(); //初始化Gpio口
InitEv(); //初始化EV
intcount=0; //T1定时器周期中断计数器
increase=0; //占空比逐渐变小的变化趋势标志位
decrease=1; //占空比逐渐变大的变化趋势标志位
PieCtrl.PIEIER2.bit.INTx4=1; //使能PIE中断,T1定时器中断位于INT2.4
IER|=M_INT2;
EINT; //开全局中断
ERTM; //开实时中断
EvaRegs.T1CON.bit.TENABLE=1; //使能定时器T1计数操作
while(1)
{
}
}
❽ 求51单片机用三个定时器同时产生3路占空比可调的pwm的程序
一个定时器就能搞定
#include<reg51.h>
#include<INTRINS.h>
#defineu16unsignedint
#defineu8unsignedcharsbitpwm1=P1^0;
sbitpwm2=P1^1;
sbitpwm3=P1^2;
u8jsflag;
u8pwm[3]={0,100,200};//三路pwm的值,范围为0-200
voidinit() //初始化函数
{TMOD|=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
}
voidmain()//主函数
{
init();
while(1);
}voidtimer0()interrupt1//定时器,100us
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
if(++jsflag>=200)jsflag=0;
pwm1=(jsflag>=pwm[0]?0:1);
pwm2=(jsflag>=pwm[1]?0:1);
pwm3=(jsflag>=pwm[2]?0:1);
}