完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大虾们,我有一个自动伺服的小程序,一直得不到解决,请各位指教一下.有三个传感器,分别表示三个位置,转动时,我希望用这三个传感器来进行伺服,当从A点到B点或C点任意两个点之间的时间超过设定值时,自动增加PWM占空比,当时间小于设定值时自动减小PWM占空比如何实现?
下面是我的程序 #include"stc12c5a.h" #include #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口定义**********/ ***it rn_qd_out=P4^2; //揉捏驱动口定义// ***it cd_qd_out=P1^4; //捶打驱动口定义// ***it xz_qd_out=P1^0; //行走驱动口定义// ***it xz_hx_out=P1^2; //行走换向口定义// ***it ***_qd_out=P2^0; //脚部驱动口定义// ***it ***_hx_out=P3^6; //脚部换向口定义// ***it hb_qd_out=P3^7; //背部驱动口定义// ***it hb_hx_out=P4^0; //背部换向口定义// ***it xz_jisu_in=P3^4;//行走计数口定义// ***it kuan_jc_in=P1^7;//宽检测口定义// ***it zong_jc_in=P1^6;//中检测口定义// ***it zai_jc_in=P1^5; //窄检测口定义// ***it shang_in=P4^3; //上限位检测口定义// ***it xia_in=P3^3; //下限位检测口定义// ***it qibeng_out=P1^1;//气泵输出口定义// ***it 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; } |
|
相关推荐
6个回答
|
|
用PID啊
|
|
|
|
不懂什么是PID,求详解
|
|
|
|
这种可以仿真跟踪代码.最好查问题了.
|
|
|
|
多谢大家
|
|
|
|
先谢谢
|
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9050 浏览 16 评论
4085 浏览 18 评论
1171浏览 3评论
602浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
594浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2331浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 04:17 , Processed in 1.168581 second(s), Total 93, Slave 73 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号