历史上的今天
今天是:2024年10月10日(星期四)
2018年10月10日 | stm8系列输入捕获
2018-10-10 来源:eefocus
输入捕获分为两种,一种是正常的输入捕获,当检测到输入信号的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIM1_CCRx)中。当发生捕获事件时,相应的CCiIF标志(TIM1_SR寄存器)被置1 。如果使能了中断,则产生中断, 置位CCiIF寄存器或者读取捕获寄存器的值可以清除 CCiIF 。
配置步骤:
1.选择有效的输入信号,选择channel;
2. 输入信号TIi的特点,配置TIM1_CCMRi寄存器中的ICiF位来设置相应的输入滤波器的滤波时间。
3.选择触发方式,上升沿下降沿。
4.设置预分频器;
5.设置TIM1_CCER1寄存器的CC1E=1,允许捕获计数器的值到捕获寄存器中;
6.enable interrupt;
result->
1.TIM1_CCR1寄存器保存寄存器到值;
2. CCiIF的值违背清除而发生两个连续的触发是, CCiOF的值也变为1;
3.CC interrupt
第二种是PWM输入信号测量
差别:
1. 两个通道信号被映射到一个输入上;
2.这两个通道信号极性相反;
3.其中一个TIiFP信号设置为触发信号,触摸模式控制器被配置为复位触发模式。
配置(测量TI1输入pwm信号的周期(CCR1)和占空比(CCR2)):
1.选择TIM1_CCR1的有效输入:置TIM1_CCMR1寄存器的CC1S=01(选中TI1)。
2. 选择TI1FP1的有效极性(用来捕获数据到TIM1_CCR1中和清除计数器):置CC1P=0(上升沿有效)。
3.选择TIM1_CCR2的有效输入:置TIM1_CCMR2寄存器的CC2S=10(选中TI1FP2)。
4. 选择TI1FP2的有效极性(捕获数据到TIM1_CCR2):置CC2P=1(下降沿有效)。
5.选择有效的触发输入信号:置TIM1_SMCR寄存器中的TS=101(选择TI1FP1)。
6. 配置触发模式控制器为复位触发模式:置TIM1_SMCR中的SMS=100。
7. 使能捕获:置TIM1_CCER1寄存器中CC1E=1, CC2E=1。
pwm输入捕获模式中断中,首先检查CC1IF和CC2IF寄存器是否为1,然后读取周期和占空比通过CCR1和CCR2寄存器。具体例子如下:
void Ir_Receive(void)
{
switch(IrRecStep)
{
case 0:
IrIndex = 0;
if ((TIM1_SR1_CC1IF == 1)&&(TIM1_SR1_CC2IF == 1)) //捕获完成,CC1IF.CC2IF为捕获标记
{
IrHigh = (uint)(TIM1_CCR2H);
IrHigh = (IrHigh << 8) + TIM1_CCR2L; //IrHigh占空比
IrCycle = (uint)(TIM1_CCR1H);
IrCycle = (IrCycle << 8) + TIM1_CCR1L; //IrCycle周期
//是否在引导码低电平范围内
if (((IrCycle - IrHigh) < IrHeadLow_Max)&&((IrCycle - IrHigh) > IrHeadLow_Min)) (低电平持续时间,即输入高电平时间)
{
IrRecStep = 1;
TIM1_SR1_CC1IF = 0;
TIM1_SR1_CC2IF = 0;
TIM1_SR2_CC1OF = 0;
TIM1_SR2_CC2OF = 0;
TIM1_SR1_UIF = 0;
IrRecBuff[0] = 0;
IrRecBuff[1] = 0;
IrRecBuff[2] = 0;
IrRecBuff[3] = 0;
}
}
break;
case 1:
if ((TIM1_SR2_CC1OF==1) || (TIM1_SR2_CC2OF==1) || (TIM1_SR1_UIF==1))//UIF位是中断更新位,CCIOF.CC2OF为重复捕获标记
{
IrRecStep = 0;
}
else
{
if ((TIM1_SR1_CC1IF == 1)&&(TIM1_SR1_CC2IF == 1))
{
IrHigh = (uint)(TIM1_CCR2H);
IrHigh = (IrHigh << 8) + TIM1_CCR2L;
IrCycle = (uint)(TIM1_CCR1H);
IrCycle = (IrCycle << 8) + TIM1_CCR1L;
//是否在引导码高电平范围内
if ((IrHigh < IrHeadHigh_Max)&&(IrHigh > IrHeadHigh_Min))
{
IrRecStep = 2;
}
}
}
break;
case 2:
if ((TIM1_SR2_CC1OF==1) || (TIM1_SR2_CC2OF==1) || (TIM1_SR1_UIF==1))
{
IrRecStep = 0;
}
else
{
if ((TIM1_SR1_CC1IF == 1)&&(TIM1_SR1_CC2IF == 1))
{
IrHigh = (uint)(TIM1_CCR2H);
IrHigh = (IrHigh << 8) + TIM1_CCR2L;
IrCycle = (uint)(TIM1_CCR1H);
IrCycle = (IrCycle << 8) + TIM1_CCR1L;
//周期是否在数据0范围内
if ((IrCycle > IrData00_Min)&&(IrCycle < IrData00_Max))
{
//高电平是否在数据0范围内
if ((IrHigh > IrData0_Min)&&(IrHigh < IrData0_Max))
{
IrIndex++;
}
else
{
IrRecStep = 0;
}
}
//周期是否在数据1范围内
else if ((IrCycle > IrData10_Min)&&(IrCycle < IrData10_Max))
{
//高电平是否在数据1范围内
if ((IrHigh > IrData1_Min)&&(IrHigh < IrData1_Max))
{
IrRecBuff[IrIndex >> 3] |= IrCode[IrIndex & 0x07];
IrIndex++;
}
else
{
IrRecStep = 0;
}
}
else
{
IrRecStep = 0;
}
if(IrIndex >= 32)
{
IrRecStep = 0;
IrRecFlag = 1;
}
}
}
break;
}
}
初始化及数据解析位于HT16C22工程。直接看文档操作寄存器还是更直接更明了,库函数总是朦朦胧胧,看似方便快捷,实则雾里看花。
上一篇:单片机延时方法总结
史海拾趣
|
大家可能对315晚会上的现场投诉统计记忆犹新,电信服务类的投诉仍然居各类服务行业投诉的首位。当然,经过多年的时间,在广大用户、消费者协会和媒体不懈努力下,电信服务已经有了诸多改善,如运营商取消了服务协议中的霸王条款、降低资费、话费余 ...… 查看全部问答> |
|
电路图 程序代码 #include #include \"18b20.h\" sbit P10 = P1^0; sbit P11 = P1^1; sbit P12 = P1^2; sbit P13 = P1^3; sbit P14 = P1^4; sbit P15= P1^5; void Delay_50ms(unsigned int aiDelay) { unsigned int&nb ...… 查看全部问答> |
|
file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/moz-screenshot.pngfile:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/moz-screenshot-1.png… 查看全部问答> |
|
vxworks能否编出动态库,即可否生成.so文件? 我在使用两种编译环境tornado2.2 和 Wind River。先前我们编库时都是编写静态库(.a文件),最近我找到了一个(动态库文件.so),但不知道如何生成动态库,请高手赐教!哪一种编译环境下都可以的。谢谢!… 查看全部问答> |
|
问题描述: wince5.0 wifi模块正常工作,启动时wifi配置对话框弹出,链接后能正常工作 ,现在我们的要求是去掉explorer.exe ,直接启动我们的界面程序,任务条没有了 ,托盘没有了 ,配置对话框也不弹出来了 ? 问题: 如何在我们的界面程序中 ...… 查看全部问答> |
|
原来做的项目用的图是bmp的,图多比较大,想换成png格式的. 所以下了个CCePngButtonST控件. 但是调用SetImage()时,却总是失败.因为CoCreateInstance()不成功. CoInitializeEx(NULL,COINIT_MULTITHREADED); //initialize com ,就是下面这句不成 ...… 查看全部问答> |




