找回密码
 立即注册
查看: 86|回复: 5

如何用 【P1.6 / PWM4P】 测量信号周期

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:350
  • 最近打卡:2026-03-05 05:40:09

63

主题

210

回帖

2408

积分

金牌会员

积分
2408
发表于 2026-2-5 02:17:25 | 显示全部楼层 |阅读模式
问题描述:

想用使用8H1K08-TSSOP20 mcu的P1.6测量来自外部的输入信号的周期,
经过深入研究发现,似乎只有从CC1/2/5/6针脚输入的信号才可以被测量 :-
现在的问题是,硬件已经成型,固定从P1.6(也就是CC4,或者叫PWM4P)输入,
想利用PWMA计数器的复位触发模式,
读PWMA_CCR4H/L寄存器得到上次输入时钟数,
从而简便得到输入信号的周期。

想请教下,此题还有解吗?
谢谢先 :-)



回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2026-03-20 21:53:40

844

主题

1万

回帖

2万

积分

管理员

积分
22719
发表于 2026-2-5 08:10:02 | 显示全部楼层

截图202602050809528411.jpg

截图202602050809133245.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2026-03-20 21:53:40

844

主题

1万

回帖

2万

积分

管理员

积分
22719
发表于 2026-2-5 08:12:05 | 显示全部楼层
截图202602050812016918.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2026-03-20 21:53:40

844

主题

1万

回帖

2万

积分

管理员

积分
22719
发表于 2026-2-5 08:13:21 | 显示全部楼层
截图202602050813166306.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2026-03-20 21:53:40

844

主题

1万

回帖

2万

积分

管理员

积分
22719
发表于 2026-2-5 08:14:36 | 显示全部楼层
截图202602050814257810.jpg



#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;
    }
}


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:350
  • 最近打卡:2026-03-05 05:40:09

63

主题

210

回帖

2408

积分

金牌会员

积分
2408
发表于 2026-2-5 21:37:25 | 显示全部楼层
问题是,如果使用了CC4如何为它配置触发源,也就是PWMA_SMCR寄存器如何配置?
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-3-22 06:33 , Processed in 0.113094 second(s), 68 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表