📄 pca.c
字号:
#include "common.h"
#include <stdlib.h>
#include "pca.h"
//bit leftw_direct;
//bit rightw_direct;
sbit P6_0=P6^0; //en2
sbit P6_1=P6^1; //en1
#define leftw_direct P6_1 //控制左轮方向
#define rightw_direct P6_0 //控制右轮方向
//uchar leftw_direct;
//uchar rightw_direct;
//sbit ECOM0=PCA0CPM0^6;
/********/
void pca0_ini()
{
temppage = SFRPAGE;
SFRPAGE=0x00;
PCA0MD=0x08;//PCA采用系统时钟,且PCA溢出中断禁止
PCA0CN=0x40;//启动PCA计数器
EIE1|=0x08;//PCA中断使能,EPCA
SFRPAGE=temppage;
}
/*****CEX0,CEX1为PWM输出*/
void pca0_cex0_ini()
{
temppage = SFRPAGE;
SFRPAGE=0x00;
PCA0CPM0=0X42; //CEX1为8bit PWM输出模式
SFRPAGE=temppage;
}
void pca0_cex1_ini()
{
temppage = SFRPAGE;
SFRPAGE=0x00;
PCA0CPM1=0X42; //CEX1为8bit PWM输出模式
SFRPAGE=temppage;
}
/************************/
void PWM_set(uchar vleft,uchar vright)
{ //占空比设置,高电平占空比为(256-vleft)/256
temppage = SFRPAGE;
SFRPAGE = 0x00;
PCA0CPH0=vleft;
PCA0CPH1=vright;
SFRPAGE=temppage;
}
/**********************/
void drive_set(char vleft, char vright)//有符号字符型,取值范围-128~+127;
//0,-128为速度最大,STOP速度最小,正数正转,负数反转
{
uchar m_vleft,m_vright;
m_vleft=256-2*abs(vleft);
m_vright=256-2*abs(vright);
temppage=SFRPAGE;
SFRPAGE=0x00;
PCA0CPM0=0X42;
PCA0CPM1=0X42;
SFRPAGE=temppage;
SFRPAGE = 0x0F;
if(vleft<0)
{
leftw_direct=0;
}
else
{
leftw_direct=1;
}
if(vright<0)
{
rightw_direct=0;
}
else
{
rightw_direct=1;
}
PWM_set(m_vleft,m_vright);
}
void go_forward()
{
drive_set(110,0);
}
void go_back()
{
drive_set(-110,-110);
}
void turn_left()
{
drive_set(-110,110);
}
void turn_right()
{
drive_set(110,-110);
}
void turnright90()
{
drive_set(127,-127);
delay1ms(2000);
}
void turnleft90()
{
drive_set(-110,110);
delay1ms(2000);
}
void go_fast()
{
drive_set(0,0);
}
void stop() //清零ECOMn来实现0%,即低电平输出
{
temppage=SFRPAGE;
SFRPAGE=0x00;
PCA0CPM0=0X02;
PCA0CPM1=0X02;
SFRPAGE=temppage;
}
/*********CEX2,CEX3崭罕哐卮シ⒛J烬
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -