新手上路
- 积分
- 39
- 金钱
- 39
- 注册时间
- 2013-7-29
- 在线时间
- 0 小时
|
大虾们,我有一个自动伺服的小程序,一直得不到解决,请各位指教一下.有三个传感器,分别表示三个位置,转动时,我希望用这三个传感器来进行伺服,当从A点到B点或C点任意两个点之间的时间超过设定值时,自动增加PWM占空比,当时间小于设定值时自动减小PWM占空比如何实现?
下面是我的程序
#include"stc12c5a.h"
#include<intrins.h>
#include"io_init.c"
#include"time.c"
#include"rn_out_mode.c"
void delay(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=1100;j>0;j--);
}
void main()
{
io_init();//初始化IO//
delay(1000);
Timer0Init();
PWM_init(); //PWM初始化//
while(1)
{
PWM0_set(RN_dat);
}
}
/*time.c*/
void Timer0Init(void)//100微秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x50; //设置定时初值
TH0 = 0xFB; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //开定时器0中断//
EA = 1; //开总中断//
}
void time0()interrupt 1 using 1
{
uint i,j;
TF0=0;
i++;
if(i>=100)//10mS计数一次//
{i=0;RN_PWM++;}//自调整PWM条件计数//
}
/*io_init.c*/
#define uint unsigned int
#define uchar unsigned char
uchar RN_dat=178;//PWM占空比设定值为178//
uint RN_PWM=0;
/**********工作IO口定义**********/
sbit rn_qd_out=P4^2; //揉捏驱动口定义//
sbit cd_qd_out=P1^4; //捶打驱动口定义//
sbit xz_qd_out=P1^0; //行走驱动口定义//
sbit xz_hx_out=P1^2; //行走换向口定义//
sbit jb_qd_out=P2^0; //脚部驱动口定义//
sbit jb_hx_out=P3^6; //脚部换向口定义//
sbit hb_qd_out=P3^7; //背部驱动口定义//
sbit hb_hx_out=P4^0; //背部换向口定义//
sbit xz_jisu_in=P3^4;//行走计数口定义//
sbit kuan_jc_in=P1^7;//宽检测口定义//
sbit zong_jc_in=P1^6;//中检测口定义//
sbit zai_jc_in=P1^5; //窄检测口定义//
sbit shang_in=P4^3; //上限位检测口定义//
sbit xia_in=P3^3; //下限位检测口定义//
sbit qibeng_out=P1^1;//气泵输出口定义//
sbit gfang_out=P1^3; //功放输出//
/*********************************/
void io_init()
{
P0M0=0xff0M1=0;//全部设为强推挽//
P1M0=0x1f1M1=0;//低4位高1位为强推挽高3位为弱上拉0001 1111//
P2M0=0x012M1=0;//P2.0为强推挽其余为弱上拉//
P3M0=0xe63M1=0;//P3.4/P3.3/P3.0为弱上拉其余为强推挽//
P4M0=0x334M1=0;//P4.5/P4.4/P4.1/P4.0为强推挽.其余为弱上拉0011 0010//
P0=01=0xe02=0; //初始化IO//
P3=0x194=0x08; //初始化IO//
}
/*rn_out_mode.c*/
void PWM_init()
{
AUXR1=0x00;
CCON=0;
CL=0; //设置低位初值//
CH=0; //设置高位初值//
CMOD=0x0C; //设置PCA定时器为对时钟12分频0000 0000//
CCAP1H=0; // PWM0初始值为0//
CCAP1L=0; //设置PWM0初值与CCAP0H相同//
CCAPM1=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)//
CR=1; //启动PCA计数器//
}
/*************************************
如是感应器接收到信号,就把在定时器里的自增变量
RN_PWM清0,如果超过一定时间不清除,则RN_PWM就会
超过设定值40,一但超过就视为需要增加PWM占空比来
提高电机功率,以达到自动调整的目的。
*************************************/
void PWM0_set(uchar dat)
{
CCF1=0; //必须清除匹配标志//
if(kuan_jc_in==0){j=0;RN_PWM=0;}//每次到感应器就清除RN_PWM//
if(zai_jc_in==0){RN_PWM=0;}//每次到感应器就清除RN_PWM//
if(RN_PWM>=40){j=1;}//当超过设定的时间40,增加PWM占空比//
if(j==1){RN_dat++;}
else RN_dat=178;
CCAP1L=CCAP1H=dat;
}
|
|