- 打卡等级:初来乍到
- 打卡总天数:5
- 最近打卡:2025-08-19 14:22:25
注册会员
- 积分
- 67
|
楼主,不好意思,还来打扰你,你的工程文件能够打包全了给我参考吗?下载下来缺少头文件
现在遇到的问题是在低频段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);//触发计算频率任务
}
}
|
-
|