找回密码
 立即注册
楼主: zuodazuo

高级PWM定时器计数器溢出中断问题 | 已给出完整的参考测试程序

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-19 14:22:25

3

主题

10

回帖

67

积分

注册会员

积分
67
发表于 5 天前 | 显示全部楼层
王*** 发表于 2025-6-24 19:36
这里给出一个使用Ai8051U实验箱V1.2测试通过的软件版本,经过测试,可以正常捕获1Hz~50Khz之间的信号(再 ...

楼主,不好意思,还来打扰你,你的工程文件能够打包全了给我参考吗?下载下来缺少头文件 截图202508191702566541.jpg

现在遇到的问题是在低频段400-2kHz之间,测量的数值是对的,但是3kHz-4kHz就不对了,然后5kHz以上数据又恢复了,实时查看PWMA_CCR1的值,看到,低频段和高频段的值是对的,但是在3kHz-4kHz之间PWMA_CCR1H的值为FF FF,PWMA_CCR1L的值是对的,不知道为什么PWMA_CCR1H没有清零,测试记录如下:

[17:06:39.422]发送→00 03 00 01 00 04 14 18
[17:06:39.483]接收←00 02 33 78 00 02 33 1C  对应的1kHz的PWMA_CCR1值为00 02 33 78 换算为频率144000000/144248=998.28
[17:06:55.876]发送→00 03 00 01 00 04 14 18
[17:06:55.937]接收←00 01 18 D4 00 01 18 D2  对应的2kHz的PWMA_CCR1值为00 03 00 01 换算为频率144000000/71892=2003.00
[17:07:03.555]发送→00 03 00 01 00 04 14 18
[17:07:03.604]接收←FF FF BA C7 06 E1 FF FF 对应的3kHz的PWMA_CCR1值为FF FF BA C7不对了
[17:07:06.968]发送→00 03 00 01 00 04 14 18
[17:07:07.018]接收←FF FF 8B ED 03 41 FF FF 对应的4kHz的PWMA_CCR1值为FF FF 8B ED不对了
[17:07:10.844]发送→00 03 00 01 00 04 14 18
[17:07:10.903]接收←00 00 6F B2 00 00 6F AA 对应的5kHz的PWMA_CCR1值为00 00 6F B2换算为频率144000000/28594=5036.02
[17:07:13.747]发送→00 03 00 01 00 04 14 18
[17:07:13.801]接收←00 00 5C E1 00 00 5C E3 对应的6kHz的PWMA_CCR1值为00 00 5C E1换算为频率144000000/23777=6056.27
[17:07:16.709]发送→00 03 00 01 00 04 14 18
[17:07:16.766]接收←00 00 50 7B 00 00 50 76 对应的7kHz的PWMA_CCR1值为00 00 50 7B换算为频率144000000/20603=6989.27
[17:07:24.989]发送→00 03 00 01 00 04 14 18
[17:07:25.034]接收←00 00 46 70 00 00 46 6E对应的8kHz的PWMA_CCR1值为00 00 46 70换算为频率144000000/18032=7985.8

程序如下:

#include "STC32G.h"
#include<stcdefine.h>
#include "STCconfig.h"
#include "intrins.h"
char ReadPWMA(char addr)
{
    char dat;
   
    while (HSPWMA_ADR & 0x80);              //等待前一个异步读写完成
    HSPWMA_ADR = addr | 0x80;               //设置间接访问地址,只需要设置原XFR地址的低7位
                                            //HSPWMA_ADDR寄存器的最高位写1,表示读数据
    while (HSPWMA_ADR & 0x80);              //等待当前异步读取完成
    dat = HSPWMA_DAT;                       //读取异步数据
   
    return dat;
}

void WritePWMA(char addr, char dat)
{
    while (HSPWMA_ADR & 0x80);              //等待前一个异步读写完成
    HSPWMA_DAT = dat;                       //准备需要写入的数据
    HSPWMA_ADR = addr & 0x7f;               //设置间接访问地址,只需要设置原XFR地址的低7位
                                            //HSPWMA_ADDR寄存器的最高位写0,表示写数据
}

char ReadPWMB(char addr)
{
    char dat;
   
    while (HSPWMB_ADR & 0x80);              //等待前一个异步读写完成
    HSPWMB_ADR = addr | 0x80;               //设置间接访问地址,只需要设置原XFR地址的低7位
                                            //HSPWMB_ADDR寄存器的最高位写1,表示读数据
    while (HSPWMB_ADR & 0x80);              //等待当前异步读取完成
    dat = HSPWMB_DAT;                       //读取异步数据
   
    return dat;
}

void WritePWMB(char addr, char dat)
{
    while (HSPWMB_ADR & 0x80);              //等待前一个异步读写完成
    HSPWMB_DAT = dat;                       //准备需要写入的数据
    HSPWMB_ADR = addr & 0x7f;               //设置间接访问地址,只需要设置原XFR地址的低7位
                                            //HSPWMB_ADDR寄存器的最高位写0,表示写数据
}
void intial_PWM_Capture()
{
                EAXFR = 1;//扩展寄存器(XFR)访问使能
                CKCON = 0;//提高访问XRAM速度
          HSPWMA_CFG = 0x07;                      //使能PWMA相关寄存器异步访问功能m,并使能异步模式PWM中断
                Delay1ms(10);
                WritePWMA((char)&PWMA_CCER1, 0x00);        //写 CCMRx 前必须先清零 CCxE 关闭通道
                WritePWMA((char)&PWMA_CCMR1, 0x01); //CC1为输入模式,请映射到TI1FP1上,通道模式配置
                WritePWMA((char)&PWMA_SMCR, 0x54);//上升沿复位模式
//                WritePWMA((char)&PWMA_SMCR, 0x56);//上升沿触发模式计数器不复位
                WritePWMA((char)&PWMA_CCMR2, 0x02);//CC2为输入模式,请映射到TI1FP2上
                WritePWMA((char)&PWMA_CCER1, 0x31); //使能CC1/CC2捕获功能,设置捕获机型为CC1的上升沿CC2的下降沿

                TIM1CH1_CAPTURE_num = 0;//捕获个数清零
                TIM1CH1_CAPTURE_VAL[15]=(0);//捕获数值数组清零
                WritePWMA((char)&PWMA_CR1, 0x05); //开始计时,允许计时器溢出更新中断
                WritePWMA((char)&PWMA_IER, 0x07);//使能CC1/CC2捕获中断,使能更新事件中断
                EA = 1;     //打开总中断
}
u32 high_time = 0, low_time = 0;
int32 cc1=0, cc2 = 0;
/*捕获中断、事件更新中断*/
void PWMA_ISR() interrupt 26
{
                u8 sta;
                sta = ReadPWMA((char)&PWMA_SR1);
          if(sta & 0X01)//计时器溢出事件中断
    {
                                cnt++;
                }
    if(sta & 0X02)//CC1捕获中断
    {
                        if(frist_state == START)
                        {
                                frist_state = WAIT_RISING;
                                cnt = 0;
                        }
                        else if(TIM1CH1_CAPTURE_num<CAPTURE_maxnum)
                        {
                                P33 = ~P33;
                                cc1 = ReadPWMA((char)&PWMA_CCR1H);
                                cc1 = (cc1<<8)+ReadPWMA((char)&PWMA_CCR1L)+cnt*65536L;//CC1捕获周期宽度
                                cnt = 0;
                                TIM1CH1_CAPTURE_VAL[TIM1CH1_CAPTURE_num]= cc1;
                                TIM1CH1_CAPTURE_num++;
                        }
                        else
                        {
                                WritePWMA((char)&PWMA_CR1, 0x06); //停止计时,禁止计时器溢出更新中断
                                WritePWMA((char)&PWMA_IER, 0x00);//禁止中断
                                frist_state = START;
                                cnt = 0;
                                AppendTaskToQueue(frequency_Calculation_task);//触发计算频率任务
                        }
    }

截图202508191712251328.jpg

点评

您好,程序并非缺少头文件,只需要使用最新版本的stc-isp 选择keil仿真设置选项卡,点击添加头文件到keil中即可 [attachimg]112428[/attachimg] 可以先测试一下我的原版程序,可以直接输出计算后的频率值的  详情 回复 发表于 5 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:547
  • 最近打卡:2025-08-21 21:27:12
已绑定手机
已实名认证

116

主题

2712

回帖

6806

积分

版主

积分
6806
发表于 5 天前 | 显示全部楼层
zuod*** 发表于 2025-8-19 17:15
楼主,不好意思,还来打扰你,你的工程文件能够打包全了给我参考吗?下载下来缺少头文件

现在遇到的问题 ...

您好,程序并非缺少头文件,只需要使用最新版本的stc-isp
选择keil仿真设置选项卡,点击添加头文件到keil中即可
截图202508191738213781.jpg
可以先测试一下我的原版程序,可以直接输出计算后的频率值的
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-19 14:22:25

3

主题

10

回帖

67

积分

注册会员

积分
67
发表于 5 天前 | 显示全部楼层
楼主您好,你给我的是ai8051的,我用的是stc32g8k64的片子,调试口是用的p3.0和p3.1的串口,您给我的工程,我换了芯片型号,烧录进去,串口没反应,不知道是不是ai8051自带usb能够输出还是就是串口输出,请问我怎么移植,或者您看看帮我移植一下,项目进度比较赶,感谢支持! 截图202508191939155690.jpg 如图我的配置信息及接收到的消息
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-24 02:13 , Processed in 0.137431 second(s), 61 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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