如何用 【P1.6 / PWM4P】 测量信号周期
问题描述:想用使用8H1K08-TSSOP20 mcu的P1.6测量来自外部的输入信号的周期,
经过深入研究发现,似乎只有从CC1/2/5/6针脚输入的信号才可以被测量 :-
现在的问题是,硬件已经成型,固定从P1.6(也就是CC4,或者叫PWM4P)输入,
想利用PWMA计数器的复位触发模式,
读PWMA_CCR4H/L寄存器得到上次输入时钟数,
从而简便得到输入信号的周期。
想请教下,此题还有解吗?
谢谢先 :-)
#include "reg51.h"
#include "intrins.h"
typedef struct TIM1_struct
{
volatile unsigned char CR1; /*!< control register 1 */
volatile unsigned char CR2; /*!< control register 2 */
volatile unsigned char SMCR; /*!< Synchro mode control register */
volatile unsigned char ETR; /*!< external trigger register */
volatile unsigned char IER; /*!< interrupt enable register*/
volatile unsigned char SR1; /*!< status register 1 */
volatile unsigned char SR2; /*!< status register 2 */
volatile unsigned char EGR; /*!< event generation register */
volatile unsigned char CCMR1; /*!< CC mode register 1 */
volatile unsigned char CCMR2; /*!< CC mode register 2 */
volatile unsigned char CCMR3; /*!< CC mode register 3 */
volatile unsigned char CCMR4; /*!< CC mode register 4 */
volatile unsigned char CCER1; /*!< CC enable register 1 */
volatile unsigned char CCER2; /*!< CC enable register 2 */
volatile unsigned char CNTRH; /*!< counter high */
volatile unsigned char CNTRL; /*!< counter low */
volatile unsigned char PSCRH; /*!< prescaler high */
volatile unsigned char PSCRL; /*!< prescaler low */
volatile unsigned char ARRH; /*!< auto-reload register high */
volatile unsigned char ARRL; /*!< auto-reload register low */
volatile unsigned char RCR; /*!< Repetition Counter register */
volatile unsigned char CCR1H; /*!< capture/compare register 1 high */
volatile unsigned char CCR1L; /*!< capture/compare register 1 low */
volatile unsigned char CCR2H; /*!< capture/compare register 2 high */
volatile unsigned char CCR2L; /*!< capture/compare register 2 low */
volatile unsigned char CCR3H; /*!< capture/compare register 3 high */
volatile unsigned char CCR3L; /*!< capture/compare register 3 low */
volatile unsigned char CCR4H; /*!< capture/compare register 3 high */
volatile unsigned char CCR4L; /*!< capture/compare register 3 low */
volatile unsigned char BKR; /*!< Break Register */
volatile unsigned char DTR; /*!< dead-time register */
volatile unsigned char OISR; /*!< Output idle register */
}TIM1_TypeDef;
#define TIM1_BaseAddress 0xFEC0
#define TIM1 ((TIM1_TypeDef xdata*)TIM1_BaseAddress)
#define PWMA_ENO (*(unsigned char volatile xdata *)0xFEB1)
#define PWMA_PS (*(unsigned char volatile xdata *)0xFEB2)
sfr P0M0 = 0x94;
sfr P0M1 = 0x93;
sfr P1M0 = 0x92;
sfr P1M1 = 0x91;
sfr P3M0 = 0xb2;
sfr P3M1 = 0xb1;
sfr P_SW2 = 0xba;
sbit P03 = P0^3;
int cap;
void main(void)
{
P_SW2 = 0x80;
P0M1 = 0x00;
P0M0 = 0xFF;
P1M1 = 0x0c;
P1M0 = 0xF3;
PWMA_ENO = 0xF3; //IO输出PWM
PWMA_PS = 0x00; //00:PWM at P1
/*配置成TRGI 的pin需关掉ENO对应bit并配成input*/
TIM1-> PSCRH = 0x00; //预分频寄存器
TIM1-> PSCRL = 0x00;
TIM1-> DTR = 0x00; //死区时间配置
TIM1-> CCMR1 = 0x68; //通道模式配置
TIM1-> CCMR2 = 0x01; //配置成输入通道
TIM1-> CCMR3 = 0x68;
TIM1-> CCMR4 = 0x68;
TIM1-> SMCR = 0x66;
TIM1-> CCER1 = 0x55; //配置通道输出使能和极性
TIM1-> CCER2 = 0x55; //配置通道输出使能和极性
TIM1-> IER = 0x04; //使能中断
TIM1-> CR1 |= 0x01; //使能计数器
EA = 1;
while (1);
}
/*通道2输入,捕获数据通过TIM1-> CCR2H / TIM1-> CCR2L 读取 */
void PWMA_ISR() interrupt 26
{
if(TIM1->SR1 & 0X02)
{
P03 = ~P03;
TIM1->SR1 &=~0X02;
}
if(TIM1->SR1 & 0X04)
{
P03 = ~P03;
cap = TIM1-> CCR2H; //读取CCR2H
cap = (cap << 8) + TIM1-> CCR2L; //读取CCR2L
TIM1->SR1 &=~0X04;
}
}
问题是,如果使用了CC4如何为它配置触发源,也就是PWMA_SMCR寄存器如何配置? 解决了吗
页:
[1]