使用cnnt 对脉冲计数,TMR1对上升沿计时,TMR2对下降沿计时,TMR1设定为100MS的定时器,TMR2 设定为40MS的定时器。
脉冲周期 为50HZ到300HZ的变化,脉冲宽度为2MS到20MS的变化,检测脉冲的个数以及宽度。
按下RA0(UP)电机正转,开始对RA2外部脉冲计数判断宽度。cnnt=380时。停止电机转动
按下RA5(DN)电机反转,开始对RA2外部脉冲计数判断宽度。cnnt==0时。 停止电机转动
程序里边用了RA1对是否进入中断进行判断。目前程序检测不到RA1的变化。是否我的设计架构方案不对。
#include
__CONFIG(0x3004);//(0X30C4);
#define T0_40MS 100 // 定义 TMR0 延时10MS 的时间常数
#define T1_100MS 40536
#define DN RA5 //Motor rise 2 DN
#define UP RA0 //Motor decline 13 UP
#define MOTA RC5 //Motor Forward 5
#define MOTB RC4 //Motor Reversal 6
bit rise; //正反转标志位
bit tmrl; //正反转标志位
bit tmrh; //正反转标志位
unsigned int num; //脉冲总个数
unsigned int cnnt; //脉冲计数
unsigned int timerl; //TMR1脉冲上升沿时间
unsigned int timerh; //TMR1脉冲下降沿时间
unsigned int cnnt_timer;//TMR1脉冲总时间
unsigned int cnnt_tmr2; //TMR2脉冲总时间
unsigned int signal_key();
unsigned int getkey() ;
void Delay_MS(unsigned int t);
void initial()
{
TRISA=0x3D;//3D;RA2=1,
TRISC=0X0E;
OPTION=0x87;//RA2内部中断时源
INTCON=0xF0;//外围中断允许
CMCON0 = 0X07;
ANSEL = 0;
// TMR0=T0_40MS;//启动TMR0自带振荡器,分频比为1:256
T1CON=0X22;//2启动TMR1自带振荡器,分频比为1:4关闭TRM1ON=0;
TMR1H=T1_100MS>>8;//0X80; //设初值
TMR1L==T1_100MS;//0X00;
TMR1IE=1; //TMR1中断允许
T2CON=0x63; //TMR2 预分频系数为1:16 ,后分频系数为1:13,开始工作 关闭TRM2ON=0;
PR2=239; //TMR2的溢出值,当 TMR2 为此值+1时溢出
TMR2IE=1; //TMR1中断允许 50MS
cnnt=0;
cnnt_timer=0;
num=10;
}
void Delay_MS(unsigned int t)
{
unsigned int a,b;
for(a=t;a>0;a--)
for(b=110;b>0;b--);
}
void Forward()
{
rise=1;
MOTB=1;
MOTA=0;
signal_key();
}
void Reversal()
{
rise=0;
MOTB=0;
MOTA=1;
signal_key();
}
void Stop()
{
MOTA=0;
MOTB=0;
}
unsigned int getkey()
{
if(!UP)
{
while(!UP)
{
if(cnnt==num){Stop();break;}
Forward();
}
}
if(!DN)
{
while(!DN)
{
if(cnnt==0){Stop();break;}
Reversal();
}
}
while(DN&&UP)
{
tmrh=0;
tmrl=0;
break;
}
}
unsigned int signal_key()
{
//---------------------- 信号下降沿检测 --------------------------//
while(!RA2) //再次确认信号,没有按下信号则退出
{
tmrh=0;
if(tmrl) break;
tmrl=1;
RA1=0;
INTF=0;
TMR1ON=0;
TMR2ON=1;
if(TMR2IF==1)//检测是否50MS错误信号,停止运行
{
TMR2ON=0;
TMR2IF=0;
PR2=239; //设初值
Stop(); //停止电机运行
return;
}
}
//---------------------- 信号上升沿检测 --------------------------//
while(RA2)
{
tmrl=0;
if(tmrh) break;
tmrh=1;
TMR2ON=0;
INTF=1;
if(TMR1IF==1)//检测是否100MS错误信号,停止运行
{
TMR1ON=0;
TMR1IF=0;
TMR1H=T1_100MS>>8;//0X80; //设初值
TMR1L=T1_100MS;//0X00;
Stop(); //停止电机运行
return;
}
break;
}
//---------------------- 取出上升沿脉冲信号时间 --------------------------//
if(TMR1ON==0)
{
timerh=TMR1H;
timerl=TMR1L;
cnnt_timer = timerh<<8;
cnnt_timer += timerl;
TMR1IF=0;
TMR1H=T1_100MS>>8;//0X80; //设初值
TMR1L=T1_100MS;//0X00;
}
//---------------------- 取出下降沿脉冲信号时间 --------------------------//
if(TMR2ON==0)
{
cnnt_tmr2 = TMR2;
TMR2IF=0;
PR2=239; //设初值
}
}
void interrupt ISR(void)
{
if(INTF==1) //脉冲开始计数,同时开启TMR1上升降计时
{
INTF=0;
RA1=1;
if(rise) cnnt++;
else cnnt--;
TMR1ON=1;
}
if( TMR1IF==1)
{
TMR1IF=0;
TMR1H=T1_100MS>>8;//0X80; //设初值
TMR1L=T1_100MS;//0X00;
}
if( TMR2IF==1)
{
TMR2IF=0;
PR2=239; //设初值
}
}
void main()
{
initial();
while (1)
{
getkey();
}
}
上一篇:pic单片机控制电机启动、转动、停止C语言程序
下一篇:超声波PIC单片机C程序
推荐阅读
史海拾趣
厦门法拉电子(Faratronic)公司的发展故事
故事一:初创与转型
厦门法拉电子的故事始于1955年,当时它以竹器合作社的形式创立。随着时代的变迁,公司在1967年敏锐地捕捉到了薄膜电容器市场的潜力,开始涉足这一领域,正式步入电子行业。这一转型为公司未来的发展奠定了坚实的基础。1970年,为了更加专业化的发展,公司更名为厦门市电容器厂,进一步明确了发展方向。通过不断的努力,法拉电子逐渐在薄膜电容器领域崭露头角。
故事二:技术引进与自动化生产
1983年是法拉电子发展历程中的一个重要节点。这一年,公司引进了国外先进的技术和设备,实现了生产过程的自动化。这一举措不仅显著提高了生产效率,还使得产品质量得到了大幅提升。自动化生产的实现,让法拉电子在竞争激烈的市场中更具优势,为其后续的发展提供了强有力的支持。
故事三:铝金属化膜的创新
1994年,法拉电子再次迈出了关键一步,成功开发出铝金属化膜。这一创新不仅使得公司的产品线得以向上游延伸,还显著缩短了电容器产品的交货时间。铝金属化膜的推出,进一步巩固了法拉电子在薄膜电容器行业的市场地位,为其后续的市场扩张奠定了坚实的基础。同年,公司更名为厦门市法拉发展总公司,标志着其业务规模和战略的升级。
故事四:股份制改革与上市
1998年,法拉电子进行了股份制改革,正式转变为厦门法拉电子股份有限公司。这一改革标志着公司正式迈入了现代化企业的新阶段。2002年,法拉电子的股票在上海证券交易所成功挂牌上市,实现了资本市场的突破。上市不仅为公司筹集到了更多的发展资金,还提升了公司的知名度和品牌影响力,为其后续的发展注入了新的动力。
故事五:全球化市场布局
进入21世纪后,法拉电子开始积极布局全球化市场。公司凭借优质的产品和服务,赢得了全球客户的认可。特别是在新能源汽车和光伏领域,法拉电子的市场份额不断扩大。2009年,公司搬迁至海沧新区,进一步提升了生产能力和研发实力。目前,法拉电子已成为全球薄膜电容器行业的领先者,产品广泛应用于照明、通讯、家电、工业控制、汽车电子等多个领域,为全球客户提供了一站式的解决方案。
ELM Technology Corporation自创立之初,就致力于电子技术的研发与创新。公司聚集了一批顶尖的科研人才,不断探索新的电子技术和解决方案。在某一关键时期,ELM推出了一款具有革命性的电子产品,该产品在市场上引起了巨大反响,不仅极大地提升了用户体验,还推动了整个电子行业的发展。通过不断的技术创新,ELM逐渐在电子行业中树立了领先地位。
静芯微电子(ElecSuper)成立于XXXX年,由一群富有远见和热情的电子工程师共同创立。公司从一开始就专注于ESD(静电放电)/TVS(瞬态电压抑制器)系列器件的研发,致力于为客户提供高质量的静电保护和电压稳定解决方案。通过不断的技术创新和产品优化,静芯微电子逐渐在ESD/TVS领域取得了突破,并积累了大量的客户基础。
AK-Nord_GmbH深知人才是企业发展的核心。因此,公司注重人才培养和团队建设。公司定期举办内部培训和交流活动,提升员工的专业技能和团队协作能力。同时,公司还积极引进外部优秀人才,为公司的创新发展注入新的活力。这些举措使得AK-Nord_GmbH的团队逐渐壮大,为公司的发展提供了有力的人才保障。
ARCOTRONICS公司一直将产品质量视为企业的生命线。公司建立了严格的质量管理体系,从原材料采购到生产过程的每一个环节都进行严格把控。同时,公司还注重售后服务,为客户提供及时、专业的技术支持和解决方案。这些举措使ARCOTRONICS公司的产品赢得了客户的广泛信赖和好评。
Acutechnology公司自XXXX年创立之初,便专注于电子技术的研发与创新。创始团队由一群富有经验的电子工程师组成,他们对市场趋势有着敏锐的洞察力。在初创期,公司集中资源投入到一项具有前瞻性的技术研发项目中,经过多次试验和改进,最终成功开发出了一款具有竞争力的电子产品,为公司的后续发展奠定了坚实的技术基础。
以下是我编的用em78p153单片机控制led灯渐亮程序,没有发现有什么错误的地方,软件仿真过了。可是烧录后用万用表接p5口发现表的指针在3-4v间摆个不停。实在找不出软件有什么问题了。 会不会是153的ic不适合用于这样的控制啊?头疼。 R17 EQ ...… 查看全部问答∨ |
我们都懂得如何利用二极管来实现开关,但是,我们只能对其进行开关操作,而不能逐渐控制信号流。此外,二极管作为开关取决于信号流的方向;我们不能对其编程以通过或屏蔽一个信号。对于诸如“流控制”或可编程开关之类的应用,我们需要一种三端器件 ...… 查看全部问答∨ |
使用这些设计技巧和ISE功能分析工具来控制功耗 新一代 FPGA的速度变得越来越快,密度变得越来越高,逻辑资源也越来越多。那么如何才能确保功耗不随这些一起增加呢?很多设计抉择可以影响系统的功耗,这些抉择包括从显见的器件选择到细小的基 ...… 查看全部问答∨ |
|
我用VISUAL STUDIO2003编写WINCE 4.2程序, 想在窗体上画个BMP图片,这个图片我已经其它的画图工具画好了,存成了一个a.bmp文件.然后我把它拷贝到工程的debug目录下,编译后, 将exe文件和该图片一起拷贝到wince4.2设备(我的电路板)的同一个目录下,,, ...… 查看全部问答∨ |
|
Accurately measuring ADC driving-circuit settling time Many modern data acquisition systems consist of highspeed,high-resolution ADCs.1 CMOS-switched, capacitorbasedADCs are often chosen for such designs due to theirlow cost and low power dissipation. These ADCs use anunbuffered front ...… 查看全部问答∨ |
|
大家好,小白刚接触DSP,有几个问题求助大家。 问题一:28335数据手册上写的SARAM资源为是34k,M0+M1+L0+...+L7=34k;那下边0X3F8000--0X3FC000这块区域中标示的L0,L1,L2,L3为什么不算进去? 问题二:0X3F8000开始的L0——L3 为安全区域双 ...… 查看全部问答∨ |