viod function(PORT,PWM)
{
int i=0;
while(1)
{
i++;
if(i<PWM)
{PORT=1;
}
if(PWM<i<100)
{PORT=0;
}
if(i=100)
{i=0;
}
}
子程序,初始化什么的,自己参照教程加进去,在main()函数里调用这个子程序,通过改变PWM,和100的值可以改变PWM频率
“用单片机怎样产生频率可调的200khzpwm波”这句话有语病,要么是占空比可调的200khzpwm波,要么是频率可调的pwm波,既然频率可调,200khz什么意思?
占空比可调的200khzpwm波,可以实现,前提是系统时钟频率足够高。方法是使用定时器中断,计算出200khz周期对应的定时器中断装载值,采取两次中断法,两次中断定时器的装载值之和等于200khz频率周期,加这个减那个,就实现占空比可调,这种方式占空比可调范围大。
频率可调的pwm波,也可实现,固定一个相位的定时周期,调整另一相位的周期,即可达到调整占空比和频率的目的,这种方法占空比的调整有一定限度。
void TIM2_PWM_OUT_Conf(void)
{
RCC->APB1ENR |=1<<0; //TIM2 Clock
RCC->APB2ENR |=1<<2; //GPA Clock
RCC->APB2ENR |=1<<0; //AFIO Clock
RCC->APB2ENR |=1<<3; //GPB Clock
RCC->APB1ENR |=7<<0; //TIM2 TIM3 TIM4 Clock
GPIOA->CRL &=0xFFFF0000; //
GPIOA->CRL |=0x0000BBBB; //AF-Out
TIM2->CR1 |=1<<4; //Count Down
TIM2->CCMR1 |=6<<4; //OC1M:PWM1
TIM2->CCMR1 |=6<<12; //OC2M:PWM1
TIM2->CCMR2 |=6<<4; //OC3M:PWM1
TIM2->CCMR2 |=6<<12; //OC4M:PWM1
// TIM2->CCMR1 |=1<<2;
// TIM2->CCMR2 |=1<<10;
// TIM2->CCMR1 |=1<<2;
// TIM2->CCMR2 |=1<<10;
TIM2->CCER |=1<<0; //CC1E ENABLE
TIM2->CCER |=1<<4; //CC2E ENABLE
TIM2->CCER |=1<<8; //CC3E ENABLE
TIM2->CCER |=1<<12; //CC4E ENABLE
TIM2->PSC =719; //720-1 PSC
TIM2->ARR =PWM_PERIOD; //20ms
TIM2->CR1 |=1<<0; //ENABLE
}
//CCR 寄存器修改占空比
频率的选择主要看你的中断间隔了,假设你的程序每50us进入一次中断,那么就是说每50us进行一次PWM调制。这样你的PWM频率就是20KHz。如果你的程序写的很多,那么你就可以设定更长的中断周期,而相应的PWM调制频率就会降低。一般的PWM调节频率保持在10K-50K都是可以接受的。不知我的回答是否让您满意呢。
void PWM_init (void){//PWM初始化函数
CMOD=0x02; //设置PCA定时器,计数频率为晶振频率/2 当为12Mhz时,PWM输出频率约234Khz
//CMOD=0x00; //设置PCA定时器,计数频率为晶振频率/12 当为12Mhz时,PWM输出频率约39Khz
//CMOD=0x04; //设置PCA定时器,计数频率为定时器0的溢出率,如果让定时器0设为16位计数模式,其溢出频率可以在很大范围内调节,从而以产生很高或很低的PWM频率
CL=0x00;
CH=0x00;
CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(0100 0010)
CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同
CCAP1H=0x00; // PWM1初始时为0
CR=1; //启动PCA定时器
}
实际上要产生低频率的PWM波,不用其硬件PWM功能完全可以
用定时器中断方式即可实现
让定时器 200us中断一次(中断不算频繁呀) ,设一变量a,每次中断a加1,100次就是20ms,,另设一变量b,数值在1-100之间,每次中断比较a和 b的大小,如果a<b,则引脚 输出高电平,否则为低电平,这样通过改变b的值,就可实现频率为50HZ,占空比1-100%可调的PWM方波
你那个地方不明白?能具体说说吗?我看程序已经有不少注释了啊?
下面的比较多,复杂些,先简单的说下吧:
一、加速减速,就是增加或减少脉冲宽度,改变电机速度!脉冲的宽度由
1、CLK=0的状态持续,由T1的定时决定;
2、CLK=1的状态持续,由(T0-T1)的时间决定;
二、定时器中断TH0=0x00 ; TL0=0x00 ;
1、T0定时器工作1方式,T0定时器启动后,从TH0、TL0赋值的计数值开始增加,增加到0XFFFF后,T0中断!
2、T0溢出后(中断),T0计数器不会自动停止,所以需要重新给T0定时器赋值!赋值后,进入下一个计数周期!
3、例子中,T0定时器从0x0000开始计数,也就是增加0xFFFF后进行中断!定时时间为 (0xFFFF / ( 晶振周期/12 ))) 秒,若晶振为12M,则定时为,65536ms!
分析程序,从main开始分析,先将起始开始的时序图画出:
如下图!
从时序图可以看出,CLK为PWM输出,
1、CLK=0的状态持续,由T1的定时决定;
2、CLK=1的状态持续,由T0-T1的时间决定;
而 main 函数中的 while(1) 部分,进行的就是PWM调整程序。
1、 if (K3==0) //高电平逆时钟转,低电平顺时钟转
{
ZF=0;
}
else
{
ZF=1;
}
根据程序推测,程序若为电机控制,K3开关为0时,ZF=0,顺时针转,K3开关为1时,ZF=1,逆时针转。
2、
if(K1==0) //按下加速键
{
delay(1);
PWML++; //调宽值低四位加1
if(PWML==0x00)
{
PWMH++;
} //调宽值高四位加1
if (PWMH==0xFF) //最大值时
{
PWMH=0xFE;
}
}
K1按键,加速按键,增加T1定时器计数起始时间,也就是减少T1计数时间,减少CLK=0的时间。
3、
if(K2==0) //按下减速键
{
delay(1);
PWML-- ; //调宽值低四位减1
if (PWML==0x00)
{
PWMH--;
} //调宽值高四位减1
if (PWMH==0x00)
{
PWMH=0x01;
} //最小值时
}
K2按键,减速按键,降低T1定时器计数起始时间,也就是增加T1计数时间,增加CLK=0的时间。
4、不论加速、减速,T0的时间都不变,CLK=0和CLK=1总持续时间不变{ (Tclk0+Tclk1)=T0 }。
程序不难,图不好画啊!
#include<reg51h>
sbit P_OUT = P3^7;
sbit UP = P1^0;
sbit DN = P1^1;
unsigned char p = 5, n;
void T0_INT() interrupt 1
{
n++;
if(n > 9) n = 0; //0~9
if(n <= p) P_OUT = 1;
else P_OUT = 0;
}
main()
{
TMOD = 0x02;
TH0 = 156;
TR0 = 1;
IE = 0x82;
while(1) {
if(P < 9 && !UP) {while(!UP); p++;}
if(p > 0 && !DN) {while(!DN); p--;}
}
}
你编译一下,汇编程序,就出来了。
以上就是关于C8051的C语言编程产生占空比可调的PWM波全部的内容,包括:C8051的C语言编程产生占空比可调的PWM波、用单片机怎样产生频率可调的200khzpwm波、如何运用STM32 的一个通用定时器产生频率可调的PWM等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)