梁工
发表于 2024-4-3 09:19:20
叶凡 发表于 2024-4-3 08:38
梁工,您好:
感谢您的回复,现在的问题有两个:
①从示波器角度看:示波器的采样参数是一致的扫描速 ...
不管是B版、C版,PWM是不会有问题的。
打开频率计看看频率跟你PWM频率是否一致。
也可以用固定的占空比测试一下,就是程序中先不要改变占空比,初始化后固定一个占空比,看看效果。
再次说明:PWM是硬件产生的,不会出现不连续的情况,如果确实出现,则一般是程序在对PWM进行开关控制(比如三相无刷电机驱动),我从未遇到、听说过硬件PWM会不连续。
叶凡
发表于 2024-4-3 09:34:45
梁工 发表于 2024-4-3 09:19
不管是B版、C版,PWM是不会有问题的。
打开频率计看看频率跟你PWM频率是否一致。
也可以用固定的占空比测 ...
梁工,您好:
目前测试时是固定占空比,同一套程序同一版PCB烧录到不同批次的单片机就会出现这个问题,我可以把我这边的单片机寄过去给您验证
梁工
发表于 2024-4-3 10:11:09
叶凡 发表于 2024-4-3 09:34
梁工,您好:
目前测试时是固定占空比,同一套程序同一版PCB烧录到不同批次的单片机就会出现这个问题 ...
第三次请求:打开示波器的频率计看看频率跟你PWM频率是否一致。
社区闲人
发表于 2024-4-3 11:03:43
用逻辑分析仪抓一下看看。
叶凡
发表于 2024-4-3 11:48:05
梁工 发表于 2024-4-3 10:11
第三次请求:打开示波器的频率计看看频率跟你PWM频率是否一致。
梁工,您好:
示波器频率与我程序设定频率一致。
正常批次波形
异常批次波形单次触发抓拍
逻辑分析仪抓取
叶凡
发表于 2024-4-3 11:49:19
社区闲人 发表于 2024-4-3 11:03
用逻辑分析仪抓一下看看。
您好,见下图:
异常波形和示波器测试结果一致
梁工
发表于 2024-4-3 12:10:46
叶凡 发表于 2024-4-3 11:48
梁工,您好:
示波器频率与我程序设定频率一致。
正常批次波形
请告知单片机具体型号、那些脚输出PWM、PWM周期、PWM频率、主频时钟,我根据你的条件编写测试程序给你测试。
叶凡
发表于 2024-4-3 13:49:43
梁工 发表于 2024-4-3 12:10
请告知单片机具体型号、那些脚输出PWM、PWM周期、PWM频率、主频时钟,我根据你的条件编写测试程序给你测 ...
梁工,您好:
出问题的单片机信息:
单片机型号: STC8G2K64S4
软件协议, V1.0: 7.3.12U
主频:
. 用户设定频率: 24.000MHz
. 调节后的频率: 24.002MHz ( 主时钟分频系数 = 1; )
PWM引脚:
PWM00-07 PWM20-27 PWM40-47 共24个引脚
PWM周期设置:
0x1000
PWM频率:
理论值:2.928KHz
示波器实测值:2.93KHz
PWM初始化程序片段:
PWM15_InitStructure.PWM_Enable = ENABLE; // PWM使能,ENABLE, DISABLE
PWM15_InitStructure.PWM_Period = 0x1000; // PWM周期,0~0x7fff
PWM15_InitStructure.PWM_Clock_Sel = PWMn_CLK_SYS; // 时钟源选择,PWMn_CLK_SYS, PWMn_CLK_TM2
PWM15_InitStructure.PWM_Clock_PS = 1; // 系统时钟分频参数(PS+1分频),0~15
PWM15_InitStructure.PWM_Counter = ENABLE; // 计数器使能,ENABLE, DISABLE
PWM15_Init(PWM2, &PWM15_InitStructure);
PWM15Duty(PWM20, 0x000, 2450); // PWM_ID, 输出低电平位置, 输出高电平位置
PWM15Duty(PWM21, 0x000, 2450); // PWM_ID, 输出低电平位置, 输出高电平位置
PWM15Duty(PWM22, 0x000, 2450); // PWM_ID, 输出低电平位置, 输出高电平位置
PWM15Duty(PWM23, 0x000, 2450); // PWM_ID, 输出低电平位置, 输出高电平位置
PWM15Duty(PWM24, 0x000, 2450); // PWM_ID, 输出低电平位置, 输出高电平位置
PWM15Duty(PWM25, 0x000, 2450); // PWM_ID, 输出低电平位置, 输出高电平位置
PWM15Duty(PWM26, 0x000, 2450); // PWM_ID, 输出低电平位置, 输出高电平位置
PWM15Duty(PWM27, 0x000, 2450); // PWM_ID, 输出低电平位置, 输出高电平位置
PWMChannelCtrl(PWM20, ENABLE, 0, DISABLE, DISABLE, DISABLE); // PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWMChannelCtrl(PWM21, ENABLE, 0, DISABLE, DISABLE, DISABLE); // PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWMChannelCtrl(PWM22, ENABLE, 0, DISABLE, DISABLE, DISABLE); // PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWMChannelCtrl(PWM23, ENABLE, 0, DISABLE, DISABLE, DISABLE); // PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWMChannelCtrl(PWM24, ENABLE, 0, DISABLE, DISABLE, DISABLE); // PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWMChannelCtrl(PWM25, ENABLE, 0, DISABLE, DISABLE, DISABLE); // PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWMChannelCtrl(PWM26, ENABLE, 0, DISABLE, DISABLE, DISABLE); // PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWMChannelCtrl(PWM27, ENABLE, 0, DISABLE, DISABLE, DISABLE); // PWM_ID, 输出使能, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWM初始化库版本:
PWM测试截图:
社区闲人
发表于 2024-4-3 15:04:25
直接找STC原厂进货多好。找中间商,出问题就,,,,,,
叶凡
发表于 2024-4-3 15:22:36
社区闲人 发表于 2024-4-3 15:04
直接找STC原厂进货多好。找中间商,出问题就,,,,,,
这次领教了{:4_167:}