❶ STC15W4K32S4单片机怎么使用自带的PWM功能同时输出控制3个电机
/*任意周期和任意占空比DUTY%的PWM*/
#define CYCLE 6000L //定义PWM周期(最大值为32767)
sbit PWM2=P3^7;
sbit PWM3=P2^1;
sbit PWM4=P2^2;
void pwminit()
{ P_SW2 |= 0x80;
PWMCFG = 0x00; //配置PWM的输出初始电平为低电平
PWMCKS = 0x0f; //选择PWM的时钟为Fosc/(0+1)
PWMC = CYCLE; //设置PWM周期,定义PWM周期(最大值为32767)
PWM2CR = 0x00; //选择PWM2输出到P3.7,不使能PWM2中断
PWM3CR = 0x00;
PWM4CR = 0x00;
PWM2T1 = 0x0001;
PWM2T2 = 0;
PWM3T1 = 0x0001;
PWM3T2 = 0;
PWM4T1 = 0x0001;
PWM4T2 = 0;
PWMCR |= 0x80; //使能PWM模块
P_SW2 &=~0x80;
}
void pwm2( unsigned int DUTY) //PWM2
{
if(DUTY==0)
{
PWMCR &=~0x01;
PWM2=0;
}
else if (DUTY==100)
{
PWMCR &=~0x01;
PWM2=1;
}
else
{
P_SW2 |= 0x80; //使能访问PWM在扩展RAM区的特殊功能寄存器XSFR
PWM2T1 = 0x0001; //设置PWM2第1次反转的PWM计数
PWM2T2 = CYCLE * DUTY / 100; //设置PWM2第2次反转的PWM计数
P_SW2 &=~0x80; //占空比为(PWM2T2-PWM2T1)/PWMC
PWMCR |= 0x01; //使能PWM信号输出
}
}
void pwm3(unsigned int DUTY) //PWM3
{
if(DUTY==0)
{
PWMCR &=~0x02;
PWM3=0;
}
else if(DUTY==100)
{
PWMCR &=~0x02;
PWM3=1;
}
else
{
P_SW2 |= 0x80;
PWM3T1 = 0x0001;
PWM3T2 = CYCLE * DUTY / 100;
P_SW2 &=~0x80;
PWMCR |= 0x02;
}
}
void pwm4(unsigned int DUTY) //PWM4
{
if(DUTY==0)
{
PWMCR &=~0x04;
PWM4=0;
}
else if (DUTY==100)
{
PWMCR &=~0x04;
PWM4=1;
}
else
{
P_SW2 |= 0x80;
PWM4T1 = 0x0001;
PWM4T2 = CYCLE * DUTY / 100;
P_SW2 &=~0x80;
PWMCR |= 0x04;
}
}
❷ STC12C5A60S2单片机怎么才能输出占空比可调的PWM
void PWM_init (void){//PWM初始化函数
CMOD=0x02; //设置PCA定时器,计数频率为晶振频率/2 当为12Mhz时,PWM输出频率约23.4Khz
//CMOD=0x00; //设置PCA定时器,计数频率为晶振频率/12 当为12Mhz时,PWM输出频率约3.9Khz
//CMOD=0x04; //设置PCA定时器,计数频率为定时器0的溢出率,晶振频率/256 当为12Mhz时,PWM输出频率约183hz
CL=0x00;
CH=0x00;
CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(0100 0010)
CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同
CCAP1H=0x00; // PWM1初始时为0
CR=1; //启动PCA定时器
}
void PWM1_set (uchar a)//PWM1占空比设置函数
{
CCAP1L=a; //设置值直接写入CCAP1L
CCAP1H=a; //设置值直接写入CCAP1H
}
主程序中,按预想规律改变PWM1_set (uchar a)的参数即可调节占空比
❸ stc8h单片机如何设置pwm频率
首先,STC8H不需要外部晶振和外部复位,也可以外接。它的时钟4M-36M。和其它stc芯片的区别是它的运行速度够快,8路16位的高级pwm定时器,4路可以输出互补的脉冲信号,在用这个芯片的时候我发现手册上有些地方讲的不是太清楚,对照了32的手册才明白了原理,今天着重说一下高级定时器的那部分。
STC8H 系列的单片机内部集成了 8 通道 16 位高级 PWM 定时器,分成两组周期可不同的 PWM,分别命名为 PWMA 和 PWMB可分别单独设置。第一组 PWM/PWMA 可配置成 4 组互补/对称/死区控制的 PWM 或捕捉外部信号,第二组 PWM/PWMB 可配置成 4 路 PWM 输出或捕捉外部信号。
pwmA可配置成输出比较,输入捕获以及pwm模式,pwm有边沿对齐以及中间对齐模式,可直接驱动一些小型的电机,在驱动一些小型的电机时一定要将相应的io口配成推挽输出在,不然驱动不起来,具体的原理就不写了,主要说一下主要寄存器以及主要模式的配置。
选择计数器时钟(内部、外部或者预分频器(PSCR)),我用的都是内部。
预分频器看你想要输出的频率范围自己设置
2. 将相应的数据写入 PWMA_ARR(设频率) 和 PWMA_CCRi (设占空比)寄存器中。频率=时钟/(PSCR+1)/(ARR+1)
3. 如果要产生一个中断请求,设置 CCiIE 位,在中断判断SR1状态位,PWMA和PWMB不是一个中断号。
4. 选择输出模式步骤:
1. 设置 OCiM=011,在计数器与 CCRi 匹配时翻转 OCiM 管脚的输出
2. 设置 OCiPE = 0,禁用预装载寄存器
3. 设置 CCiP = 0,选择高电平为有效电平,开始输出高电平。
4. 设置 CCiE = 1,使能输出
5. 设置 PWMA_CR1 寄存器的 CEN 位来启动计数器。
输入捕获配置:
先设置PSCR,根据你的所测频率范围来设数据。设ARR一般为最大值
1.选择有效输入端,设置 PWMA_CCMR1 寄存器中的 CC1S=01,此时通道被配置为输入,并且PWMA_CCR1 寄存器变为只读。
2. 根据输入信号 TIi 的特点,可通过配置 PWMA_CCMR1 寄存器中的 IC1F 位来设置相应的输入滤波器的滤波时间。假设输入信号在最多 5 个时钟周期的时间内抖动,我们须配置滤波器的带宽长于 5 个时钟周期;因此我们可以连续采样 8 次,以确认在 TI1 上一次真实的边沿变换,即在PWMA_CCMR1 寄存器中写入 IC1F=0011,此时,只有连续采样到 8 个相同的 TI1 信号,信号才为有效(采样频率为 fMASTER)。
3. 选择 TI1 通道的有效转换边沿,在 PWMA_CCER1 寄存器中写入 CC1P=0(上升沿)。
4. 配置输入预分频器。在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预分频器被禁止(写 PWMA_CCMR1 寄存器的 IC1PS=00)。
5. 设置 PWMA_CCER1 寄存器的 CC1E=1,允许捕获计数器的值到捕获寄存器中。
6. 如果需要,通过设置
PWMA_IER 寄存器中的 CC1IE 位允许相关中断请求。
7.使能计数器设置 PWMA_CR1 寄存器的 CEN 位来启动计数器。
❹ STC单片机PWM输出最大可以达到多少频率
8位控制的话是时钟/256,靠掩位可以更高,但是调控精度降低.
❺ stc12c5a60s2单片机 输出自带pwm频率怎么改变,比如说我现在需要50hz的频率
1,stc12c5a60s2一般pwm频率=PCA时钟源/256
2,PCA时钟源设置有4种方式,一般都有T0的溢出率,来设置PCA时钟源,
一般在COMD这个寄存器的B2,B1两位来确定是那种方式,10方式就是T0溢出方式(1T更快),可以做可变PCA时钟源时钟源,从而得到可变频率的pwm输出。
3,理论可生成(1-65535)个频率级别,如12MHz主频,(1T)方式最小可以做到12MHz,但实际是到了的最快也就是1/2SYsclk,即6MHz,然后除以256,理想可以输出23Khz~0.5Hz左右的频率范围
❻ STC单片机输出PWM信号,频率要25KHz,请大神指教,怎么实现,或者直接给我一个程序,谢谢!
void PWM_init (void){//PWM初始化函数
CMOD=0x02; //设置PCA定时器,计数频率为晶振频率/2 当为12Mhz时,PWM输出频率约23.4Khz
//CMOD=0x00; //设置PCA定时器,计数频率为晶振频率/12 当为12Mhz时,PWM输出频率约3.9Khz
//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方波
❼ stc12c5608ad的单片机内部的PWM最高可输出多大的频率要做红外遥控,至少要38K以上才行!
stc12c5608ad PWM最高可输出频率
; PWM = fSYS / 2 / 256
; fosc= 6 MHz PWM 频率=11.71875KHz
; fosc=12 MHz PWM 频率=23.4375KHz
; fosc=19. 456MHz PWM 频率=38.000KHz
stc12c5202ad PWM最高可输出频率
; PWM = fSYS / 256
; fosc= 6 MHz PWM 频率=23.4375KHz
; fosc=12 MHz PWM 频率=46.875KHz
; fosc=9. 728MHz PWM 频率=38.000KHz
; fosc=19. 456MHz PWM 频率=38.000KHz (PWM = fSYS / 2 / 256)