📄 control.h
字号:
00#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
//#include "PWM.h"
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
word kk1;
word kk2;
uint Rudder_Angle;
uint Car_Speed;
dword p;//存放直线加速时间
dword p1=0;//限制刹车时间
uchar u1=130;
uchar u11=90; //靠刹车那个等的速度
uchar u2=100;
uchar u3=100;
uchar u4=200;
uchar u5=70; //刹车后的速度
int ppp=0;//刹车前后的标志位
int flagk1=0;//黑道在左边的标志
int flagkk1=0;//标志是否长时间在左边的标志
int flagk2=0;//黑道在右边的标志
int flagkk2=0;//标志是否长时间在右边的标志
/*******************************获取上一次车的状态*********************/
void setRudder_Angle(uint angle)
{
Rudder_Angle = angle;
}
void setCar_Speed(uint speed)
{
Car_Speed = speed;
}
uint getRudder_Angle() //记录舵机转角
{
return Rudder_Angle;
}
uint getCar_Speed()//记录车速
{
return Car_Speed;
}
/**********************************************************************/
void PWM_Init()
{
PWME_PWME5 = 0x00; //pwm通道禁止
PWME_PWME6 = 0x00;
PWME_PWME7 = 0;
PWMCTL_CON45=0x1; //通道45连用
PWMPRCLK = 0x02; //都使用B口16分频 A口4分频
PWMCLK=0xE0;//通道67都用sB时钟源 通道5用SA时钟源
PWMSCLB=4; //s7口提供10kHz的频率 16MHZ/16/2/25=20K
PWMSCLA=1; //s45口提供10kHz的频率 16MHZ/4/2/1=2M
PWMPOL = 0xE0; //用s7口做7通道的时钟 先高电平
//对齐方式默认 左对齐
PWMPER45 = 20000; //舵机的频率是50Hz 1/10k*x=1/50Hz
PWMDTY45 = 1500;
PWME_PWME5 = 0x01;//PWM通道5输出
PWMPER6 = 200; //舵机的频率是50Hz 1/10k*x=1/50Hz
PWMDTY6 = 1;
PWMPER7 = 200; //舵机的频率是50Hz 1/10k*x=1/50Hz ,此时,周期为20ms
PWMDTY7 =200;
DDRP = 0xff; //控制输出
PWMCNT45 = 0;
PWMCNT6 = 0;
PWMCNT7 = 0;
PWME_PWME6 = 0x01;
PWME_PWME7 = 1;
}
void PWM_Init1(uint i,uchar j,uchar k)
{
PWMDTY45 =i; //舵机控制
PWMDTY6 =j;
PWMDTY7 =k;
setRudder_Angle(i);
if(j == 200)
{
setCar_Speed(k);
}
if(k == 200)
{
setCar_Speed(j);
}
}
//a,b是实际采来的 c,d是实际采来的值减去了全白 c1,c2黑白差 avg1,avg2为全白
void control_1(){
ppp=1;
if(flagkk2==1) {
PORTB=0x55;
PWM_Init1(1860,u1,u4);
}
else{ PORTB=0xF0;
PWM_Init1(1900,u4,u1);
}
flagk2=1;
flagkk1=0;
}
void control_11(){
PWM_Init1(1860,50,u4);
flagk2=1;
flagkk1=0;
}
void control_2(word a,word b,word c,word d,word c1,word c2,word avg1,word avg2){
// ppp=0;
p=0;
kk1= c1/4;
kk2= c2/4;
flagk2=1;
flagkk1=0;
if(flagkk2==1) {
PORTB=0x55; u11=u5;
}
else{ PORTB=0xF0;
if(ppp==0) u11=100;
else if(ppp==1) u11=u5;
}
if(c>d) {
if(c-d<0x0A)PWM_Init1(1800,u11,u4);
else {
if(a==c1+avg1+0x02||a==c1+avg1+0x01||a==c1+avg1||a==c1+avg1-0x01||a==c1+avg1-0x02)
PWM_Init1(1860,u11,u4);
else if(a==3*kk1+avg1) PWM_Init1(1845,u11,u4);
else if(a==2*kk1+avg1) PWM_Init1(1830,u11,u4);
else if(a==kk1+avg1) PWM_Init1(1815,u11,u4);
}
}else if(c<d){
if(d-c<0x0A)PWM_Init1(1800,u11,u4);
else {
if(b==c2+avg2+0x02||b==c2+avg2+0x01||b==c2+avg2||b==c2+avg2-0x01||b==c2+avg2-0x02)
PWM_Init1(1740,u11,u4);
else if(b==3*kk2+avg2) PWM_Init1(1755,u11,u4);
else if(b==2*kk2+avg2) PWM_Init1(1770,u11,u4);
else if(b==kk2+avg2) PWM_Init1(1785,u11,u4);
}
}else PWM_Init1(1800,u11,u4);
}
void control_3(word a,word b,word c,word d,word c1,word c2,word avg1,word avg2){
kk1= c1/4;
kk2= c2/4;
flagk2=1;
flagkk1=0;
if(flagkk2==1) {
PORTB=0x55; u3=u5;
}
else{ PORTB=0xF0;
if(ppp==0)u3=100;
else if(ppp==1) u3=u5;
}
if(c>d) {
if(c-d<0x0A)PWM_Init1(1680,u3,u4);
else {
if(a==c1+avg1+0x02||a==c1+avg1+0x01||a==c1+avg1||a==c1+avg1-0x01||a==c1+avg1-0x02)
PWM_Init1(1740,u3,u4);
else if(a==3*kk1+avg1) PWM_Init1(1725,u3,u4);
else if(a==2*kk1+avg1) PWM_Init1(1710,u3,u4);
else if(a==kk1+avg1) PWM_Init1(1695,u3,u4);
}
}else if(c<d){
if(d-c<0x0A)PWM_Init1(1680,u3,u4);
else {
if(b==c2+avg2+0x02||b==c2+avg2+0x01||b==c2+avg2||b==c2+avg2-0x01||b==c2+avg2-0x02)
PWM_Init1(1620,u3,u4);
else if(b==3*kk2+avg2) PWM_Init1(1635,u3,u4);
else if(b==2*kk2+avg2) PWM_Init1(1650,u3,u4);
else if(b==kk2+avg2) PWM_Init1(1665,u3,u4);
}
}else PWM_Init1(1680,u3,u4);
}
//a,b是实际采来的 c,d是实际采来的值减去了全白 c1,c2黑白差
void control_4(word a,word b,word c,word d,word c1,word c2,word avg1,word avg2){
kk1= c1/4;
kk2= c2/4;
ppp=0;
flagk1=0;
flagk2=0;
if(c>d) {
if(c-d<0x0A)PWM_Init1(1560,u1,u4);
else {
if(a==c1+avg1+0x02||a==c1+avg1+0x01||a==c1+avg1
||a==c1+avg1-0x01||a==c1+avg1-0x02)
PWM_Init1(1620,u1,u4);
else if(a==3*kk1+avg1) PWM_Init1(1605,u1,u4);
else if(a==2*kk1+avg1) PWM_Init1(1590,u1,u4);
else if(a==kk1+avg1) PWM_Init1(1575,u1,u4);
}
}else if(c<d){
if(d-c<0x0A)PWM_Init1(1560,u1,200);
else {
if(b==c2+avg2+0x02||b==c2+avg2+0x01||b==c2+avg2
||b==c2+avg2-0x01||b==c2+avg2-0x02)
PWM_Init1(1500,u1,u4);
else if(b==3*kk2+avg2) PWM_Init1(1515,u1,u4);
else if(b==2*kk2+avg2) PWM_Init1(1530,u1,u4);
else if(b==kk2+avg2) PWM_Init1(1545,u1,u4);
}
}else PWM_Init1(1560,u2,u4);
}
void control_5(word a,word b,word c,word d,word c1,word c2,word avg1,word avg2){
kk1= c1/4;
kk2= c2/4;
ppp=0;
flagk1=0;
flagk2=0;
if(c>d) {
if(c-d<0x0A)PWM_Init1(1440,u1,u4);
else {
if(a==c1+avg1+0x02||a==c1+avg1+0x01||a==c1+avg1||a==c1+avg1-0x01||a==c1+avg1-0x02)
PWM_Init1(1500,u1,u4);
else if(a==3*kk1+avg1) PWM_Init1(1485,u1,u4);
else if(a==2*kk1+avg1) PWM_Init1(1470,u1,u4);
else if(a==kk1+avg1) PWM_Init1(1455,u1,u4);
}
}
else if(c<d){
if(d-c<0x0A)PWM_Init1(1440,u1,u4);
else {
if(b==c2+avg2+0x02||b==c2+avg2+0x01||b==c2+avg2||b==c2+avg2-0x01||b==c2+avg2-0x02)
PWM_Init1(1380,u1,u4);
else if(b==3*kk2+avg2) PWM_Init1(1425,u1,u4);
else if(b==2*kk2+avg2) PWM_Init1(1410,u1,u4);
else if(b==kk2+avg2) PWM_Init1(1395,u1,u4);
}
}else PWM_Init1(1440,u1,u4);
}
void control_6(word a,word b,word c,word d,word c1,word c2,word avg1,word avg2){
kk1= c1/4;
kk2= c2/4;
flagk1=1;
flagkk2=0;
if(flagkk1==1) {
PORTB=0x55; u3=u5;
}
else{ PORTB=0xF0;
if(ppp==0)u3=100;
else if(ppp==1) u3=u5;
}
if(c>d) {
if(c-d<0x0A)PWM_Init1(1320,u3,u4);
else {
if(a==c1+avg1+0x02||a==c1+avg1+0x01||a==c1+avg1||a==c1+avg1-0x01||a==c1+avg1-0x02)
PWM_Init1(1340,u3,u4);
else if(a==3*kk1+avg1) PWM_Init1(1365,u3,u4);
else if(a==2*kk1+avg1) PWM_Init1(1350,u3,u4);
else if(a==kk1+avg1) PWM_Init1(1335,u3,u4);
}
}else if(c<d){
if(d-c<0x0A)PWM_Init1(1320,u3,u4);
else {
if(b==c2+avg2+0x02||b==c2+avg2+0x01||b==c2+avg2||b==c2+avg2-0x01||b==c2+avg2-0x02)
PWM_Init1(1260,u3,u4);
else if(b==3*kk2+avg2) PWM_Init1(1275,u3,u4);
else if(b==2*kk2+avg2) PWM_Init1(1290,u3,u4);
else if(b==kk2+avg2) PWM_Init1(1305,u3,u4);
}
}else PWM_Init1(1320,u3,u4);
}
void control_7(word a,word b,word c,word d,word c1,word c2,word avg1,word avg2){
p=0;
flagk1=1;
flagkk2=0;
if(flagkk1==1) {
PORTB=0x55; u11=u5;
}
else{ PORTB=0xF0;
if(ppp==0) u11=100;
else if(ppp==1) u11=u5;
}
kk1= c1/4;
kk2= c2/4;
if(c>d) {
if(c-d<0x0A)PWM_Init1(1200,u11,u4);
else {
if(a==c1+avg1+0x02||a==c1+avg1+0x01||a==c1+avg1||a==c1+avg1-0x01||a==c1+avg1-0x02)
PWM_Init1(1260,u11,u4);
else if(a==3*kk1+avg1) PWM_Init1(1245,u11,u4);
else if(a==2*kk1+avg1) PWM_Init1(1230,u11,u4);
else if(a==kk1+avg1) PWM_Init1(1215,u11,u4);
}
}else if(c<d){
if(d-c<0x0A)PWM_Init1(1200,u11,u4);
else {
if(b==c2+avg2+0x02||b==c2+avg2+0x01||b==c2+avg2||b==c2+avg2-0x01||b==c2+avg2-0x02)
PWM_Init1(1140,u11,u4);
else if(b==3*kk2+avg2) PWM_Init1(1155,u11,u4);
else if(b==2*kk2+avg2) PWM_Init1(1170,u11,u4);
else if(b==kk2+avg2) PWM_Init1(1185,u11,u4);
}
}else PWM_Init1(1200,u11,u4);
}
void control_8(){
ppp=1;
flagk1=1;
flagkk2=0;
if(flagkk1==1){
PORTB=0x55;
PWM_Init1(1100,u4,u1);
}
else {
PORTB=0xF0;
PWM_Init1(1140,u1,u4);
}
}
void control_88(){
PWM_Init1(1140,50,u4);
flagk1=1;
flagkk2=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -