现已图2为例 理解一下普通的输入捕获的例子: 输入捕获无非就是检验相同的一个或者几个边沿,根据差值 再按照一定得运算求出输入波形的周期信息,这里每个通道每次只能配置为不是上升沿就是下降沿。为什么不能配置为上升沿和下降沿都可以?像外部中断一样。细想一想我们便知道 那样做是没有意义的 因为我们不知道是上升沿还是下降沿的到来,所以对计算输入波形的信息 并不能明确算出。而外部中断作为一个事件的产生,对怎样产生 并不需要知道。 怎样检测输入信息: 以下例子说明如何在TI1输入的上升沿时捕获计数器的值到TIM1_CCR1寄存器中,步骤如下: K看图2 从左到右 依次配置完成检测通道: 根据输入信号TIi的特点,可通过配置TIM1_CCMRi寄存器中的ICiF位来设置相应的输入滤波器的滤波时间。假设输入信号在最多5个时钟周期的时间内抖动,我们须配置滤波器的带宽长于5个时钟周期;因此我们可以连续采样8次,以确认在TI1上一次真实的边沿变换,即在TIMi_CCMR1寄存器中写入IC1F=0011,此时,只有连续采样到8个相同的TI1信号,信号才为有效(采样频率为fMASTER)。 选择TI1通道的有效转换边沿,在TIM1_CCER1寄存器中写入CC1P=0(上升沿)。 配置输入预分频器。在本例中,我们希望捕获发生在每一个有效的电平转换时刻,因此预分频器被禁止(写TIM1_CCMR1寄存器的IC1PS=00) 选择有效输入端:例如TIM1_CCMR1连接到TI1输入,所以写入TIM1_CCMR1寄存器中的CC1S=01,此时通道被配置为输入,并且TIM1_CCR1寄存器变为只读。 设置TIM1_CCER1寄存器的CC1E=1,允许捕获计数器的值到捕获寄存器中。 如果需要,通过设置TIM1_IER寄存器中的CC1IE位允许相关中断请求。 以上便完成了 基本通道 如果有有效电平来 就产生事件或者中断。 配置很简单 诸如以下的例程:选择有效输入端 配置CCMR1的 CC1S位 CC1S[1:0]:捕获/比较1 选择。 这2位定义通道的方向(输入/输出),及输入脚的选择: 00:CC1通道被配置为输出; 01:CC1通道被配置为输入,IC1映射在TI1FP1上; 10:CC1通道被配置为输入,IC1映射在TI2FP1上; 11:CC1通道被配置为输入,IC1映射在TRC上。此模式仅工作在内部触发器输入被选中时(由TIM1_SMCR寄存器的TS位选择)。 注:CC1S仅在通道关闭时(TIM1_CCER1寄存器的CC1E=0)才是可写的。就是说使能tim1的时候 不能配置相关寄存器 根据图2 可知选择 TI1FP1 01值 TIM1->CCMR1 |= 0x01;即可 当发生一个输入捕获时: 当产生有效的电平转换时,计数器的值被传送到TIM1_CCR1寄存器。 CC1IF标志被设置(中断标志)。当发生至少2个连续的捕获时,而CC1IF未曾被清除时,CC1OF也被置1。 如设置了CC1IE位,则会产生一个中断。 为了处理捕获溢出(CC1OF位),建议在读出重复捕获标志之前读取数据,这是为了避免丢失在读出捕获溢出标志之后和读取数据之前可能产生的重复捕获信息。 |
RE:Stm8 tim1 pwm输入捕获学习笔记
还有就是关于图 请下载附件
好资料,学习了
RE:Stm8 tim1 pwm输入捕获学习笔记
它使用两个通道计算波形的周期和占空比:
看上图 我们使用CH1和CH2一起,不过我们配置信号只是从CH1口输入,然后通过TI1FP2到IC2 然后进入边沿检测,按照手册的配置过程:
你可以用以下方式测量TI1上输入的PWM信号的周期(TIM1_CCR1寄存器)和占空比(TIM1_CCR2寄存器)。(具体取决于fMASTER的频率和预分频器的值)
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。
5 6的触发输入 配置 是前面时间的产生去选择某一个做为触发事件 去控制比如技术控制器和技术存储器等动作
7. 使能捕获:置TIM1_CCER1寄存器中CC1E=1,CC2E=1。
配置如下:
void tim1_config(void)
{
TIM1_DeInit();
TIM1->CCER1 &= 0xee;//禁止输入捕获1,2
TIM1->CCMR1 |=0x01;// ch1到ti1fp1
TIM1->CCER1&= 0xec;//ch1 上升沿触发
TIM1->CCMR2 |=0x02;// ch2选择 ti1fp2上
TIM1->CCER1|= 0x20;//ch1 下降沿触发 ic2
TIM1->SMCR |=0X54;//选源触发源和触发方式 复位
TIM1->IER |=0x06;//使能中断ch1 ch2
TIM1->CCER1 |= 0x11;//使能输入捕获1,2
TIM1_Cmd(ENABLE);
}
RE:Stm8 tim1 pwm输入捕获学习笔记
if(TIM1_GetITStatus(TIM1_IT_CC1))
{
TIM1_ClearITPendingBit(TIM1_IT_CC1);
IC1Value=TIM1_GetCapture1();
i++;
if(i==0xff)
i=0;
}
if(TIM1_GetITStatus(TIM1_IT_CC2))
{
TIM1_ClearITPendingBit(TIM1_IT_CC2);
IC2Value=TIM1_GetCapture2();
i++;
if(i==0xff)
i=0;
}
读取波形信息的函数:
u16 GET_period(void)
{
return(IC1Value/2);//在默认内部8分频时钟2mhz 单位us
}
u16 GET_highperiod(void)
{
return(IC2Value/2);//在默认内部8分频时钟2mhz 单位us
}
u16 GET_lowperiod(void)
{
return((IC1Value-IC2Value)/2);//在默认内部8分频时钟2mhz 单位us
}
回复:Stm8 tim1 pwm输入捕获学习笔记
回复:Stm8 tim1 pwm输入捕获学习笔记
回复:Stm8 tim1 pwm输入捕获学习笔记
回复:Stm8 tim1 pwm输入捕获学习笔记
RE:Stm8 tim1 pwm输入捕获学习笔记
回复:Stm8 tim1 pwm输入捕获学习笔记
例如PWM的周期计数超过0x10000,这时这个例子就有点问题了
回复:Stm8 tim1 pwm输入捕获学习笔记
正在学习呢
回复:Stm8 tim1 pwm输入捕获学习笔记
好东西看一看
正在学习呢
好东东啊
RE:Stm8 tim1 pwm输入捕获学习笔记
RE:Stm8 tim1 pwm输入捕获学习笔记
回复:Stm8 tim1 pwm输入捕获学习笔记