这里给出一个使用Ai8051U实验箱V1.2测试通过的软件版本,经过测试,可以正常捕获1Hz~50Khz之间的信号(再 ...
楼主,不好意思,还来打扰你,你的工程文件能够打包全了给我参考吗?下载下来缺少头文件
现在遇到的问题是在低频段400-2kHz之间,测量的数值是对的,但是3kHz-4kHz就不对了,然后5kHz以上数据又恢复了,实时查看PWMA_CCR1的值,看到,低频段和高频段的值是对的,但是在3kHz-4kHz之间PWMA_CCR1H的值为FF FF,PWMA_CCR1L的值是对的,不知道为什么PWMA_CCR1H没有清零,测试记录如下:
发送→00 03 00 01 00 04 14 18
接收←00 02 33 78 00 02 33 1C对应的1kHz的PWMA_CCR1值为00 02 33 78 换算为频率144000000/144248=998.28
发送→00 03 00 01 00 04 14 18
接收←00 01 18 D4 00 01 18 D2对应的2kHz的PWMA_CCR1值为00 03 00 01 换算为频率144000000/71892=2003.00
发送→00 03 00 01 00 04 14 18
接收←FF FF BA C7 06 E1 FF FF 对应的3kHz的PWMA_CCR1值为FF FF BA C7不对了
发送→00 03 00 01 00 04 14 18
接收←FF FF 8B ED 03 41 FF FF 对应的4kHz的PWMA_CCR1值为FF FF 8B ED不对了
发送→00 03 00 01 00 04 14 18
接收←00 00 6F B2 00 00 6F AA 对应的5kHz的PWMA_CCR1值为00 00 6F B2换算为频率144000000/28594=5036.02
发送→00 03 00 01 00 04 14 18
接收←00 00 5C E1 00 00 5C E3 对应的6kHz的PWMA_CCR1值为00 00 5C E1换算为频率144000000/23777=6056.27
发送→00 03 00 01 00 04 14 18
接收←00 00 50 7B 00 00 50 76 对应的7kHz的PWMA_CCR1值为00 00 50 7B换算为频率144000000/20603=6989.27
发送→00 03 00 01 00 04 14 18
接收←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=(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= cc1;
TIM1CH1_CAPTURE_num++;
}
else
{
WritePWMA((char)&PWMA_CR1, 0x06); //停止计时,禁止计时器溢出更新中断
WritePWMA((char)&PWMA_IER, 0x00);//禁止中断
frist_state = START;
cnt = 0;
AppendTaskToQueue(frequency_Calculation_task);//触发计算频率任务
}
}
zuodazuo 发表于 2025-8-19 17:15
楼主,不好意思,还来打扰你,你的工程文件能够打包全了给我参考吗?下载下来缺少头文件
现在遇到的问题 ...
您好,程序并非缺少头文件,只需要使用最新版本的stc-isp
选择keil仿真设置选项卡,点击添加头文件到keil中即可
可以先测试一下我的原版程序,可以直接输出计算后的频率值的
楼主您好,你给我的是ai8051的,我用的是stc32g8k64的片子,调试口是用的p3.0和p3.1的串口,您给我的工程,我换了芯片型号,烧录进去,串口没反应,不知道是不是ai8051自带usb能够输出还是就是串口输出,请问我怎么移植,或者您看看帮我移植一下,项目进度比较赶,感谢支持!如图我的配置信息及接收到的消息
页:
1
[2]