STC12
回帖(1)
2021-10-18 11:36:26
这个程序是以前比赛时候准备的,方便用来调电机转速,也可作呼吸灯等。
IN1和IN2是控制端(电机A) ,控制高低电平可以来控制正反转。没有调速端口。一个方案是在供电端给不同pwm进行调速,可io供电能力有限,速度可能会慢。所以另一个方案就是一个输入端口给pwm,改变电平;另一端输入口给固定电平就可以进行调速。
stc12c5a60s2内部有2个pwm输出io口。根据芯片手册可知。
具体寄存器配置请多多自行参照手册。学会理解别人代码进行自学。这样才能进步。我记得这个pwm模块程序也是我上网查改的。
#include
#include
#define uint unsigned int
#define uchar unsigned char
void pwm_init() //PWM初始化函数,初始占空比为0
{
CMOD=0x02; //0000 0010 空闲时不计数,不产生中断,时钟源为fosc/2,因此输出占用率为fosc/512
CL=0x00;
CH=0x00;
CCAPM0=0x42; //0100 0010, 8位 PWM
CCAP0L=0x00;
CCAP0H=0x00; //PWM实现方法,因为是8位,CL基础计数器从0xFF递减到0x00,溢出后将CCAP0H的值加载到CCAP0L,若CL递减过程中,若大于CCAP0L,则输出高电平,否则为低电平
CCAPM1=0x42;
CCAP1H=0x00;
CCAP1L=0x00;
CR = 1; //开启PCA计数器
}
void pwm_set(uchar x,uchar y) //占空比设置函数 引脚为P1.3和P1.4
{
CCAP0H=x*2.55; //占空比公式D=(256-CCAPnH)/ 256(8位PWM模式)
CCAP0L=x*2.55; //乘2.55转换为0-100%
CCAP1H=y*2.55;
CCAP1L=y*2.55;
}
void main()
{
pwm_init();
while(1)
{
pwm_set(0,20); //数值反放则电机方向反转 (20,0);
}
}
这个程序是以前比赛时候准备的,方便用来调电机转速,也可作呼吸灯等。
IN1和IN2是控制端(电机A) ,控制高低电平可以来控制正反转。没有调速端口。一个方案是在供电端给不同pwm进行调速,可io供电能力有限,速度可能会慢。所以另一个方案就是一个输入端口给pwm,改变电平;另一端输入口给固定电平就可以进行调速。
stc12c5a60s2内部有2个pwm输出io口。根据芯片手册可知。
具体寄存器配置请多多自行参照手册。学会理解别人代码进行自学。这样才能进步。我记得这个pwm模块程序也是我上网查改的。
#include
#include
#define uint unsigned int
#define uchar unsigned char
void pwm_init() //PWM初始化函数,初始占空比为0
{
CMOD=0x02; //0000 0010 空闲时不计数,不产生中断,时钟源为fosc/2,因此输出占用率为fosc/512
CL=0x00;
CH=0x00;
CCAPM0=0x42; //0100 0010, 8位 PWM
CCAP0L=0x00;
CCAP0H=0x00; //PWM实现方法,因为是8位,CL基础计数器从0xFF递减到0x00,溢出后将CCAP0H的值加载到CCAP0L,若CL递减过程中,若大于CCAP0L,则输出高电平,否则为低电平
CCAPM1=0x42;
CCAP1H=0x00;
CCAP1L=0x00;
CR = 1; //开启PCA计数器
}
void pwm_set(uchar x,uchar y) //占空比设置函数 引脚为P1.3和P1.4
{
CCAP0H=x*2.55; //占空比公式D=(256-CCAPnH)/ 256(8位PWM模式)
CCAP0L=x*2.55; //乘2.55转换为0-100%
CCAP1H=y*2.55;
CCAP1L=y*2.55;
}
void main()
{
pwm_init();
while(1)
{
pwm_set(0,20); //数值反放则电机方向反转 (20,0);
}
}
举报
更多回帖