383015160
发表于 2024-8-4 22:09:46
梁工 发表于 2024-8-4 19:29
按键的很简单,,我没加上去,自己加两个按键可以接在P3.0 P.31,去掉电位器改变占空比,换成按键加减操作 ...
好的谢谢
dbq406
发表于 2024-8-8 21:38:20
梁工,你好,根据中功率图纸参数,单片机STC32G12K128 ,12V电机正常启动,24V 启动抖动很大电流,是不是哪里要改变参数
梁工
发表于 2024-8-8 22:03:13
dbq406 发表于 2024-8-8 21:38
梁工,你好,根据中功率图纸参数,单片机STC32G12K128 ,12V电机正常启动,24V 启动抖动很大电流,是不是哪 ...
那个电路不能超过18V,否则MOSFET的栅压过高会烧MOSFET的。
要工作到24V,栅压要分压一下,其中一相如下:
dbq406
发表于 2024-8-8 22:09:16
梁工 发表于 2024-8-8 22:03
那个电路不能超过18V,否则MOSFET的栅压过高会烧MOSFET的。
要工作到24V,栅压要分压一下,其中一相如下 ...
我用2个560R电阻分压,但也一样,我的MOS管用永源微AP30G04GD管
梁工
发表于 2024-8-9 10:52:39
dbq406 发表于 2024-8-8 22:09
我用2个560R电阻分压,但也一样,我的MOS管用永源微AP30G04GD管
先用12V启动,慢慢调高电压,观察其正常否。
垂柳工作室
发表于 2024-8-10 22:55:21
请大佬详解一下红线这一句,不理解哦。电位器调到中间不动,程序开始运行时adc11 =0,进入主循环后,adc11 是不是一直增加?
void main(void)
{
WTST= 0; //CPU读取程序存储器的等待时间控制等于0即不等待。
CKCON = 0; //外部数据总线时钟控制寄存器(上电复位值为7,强烈建议上电初始化为0)
EAXFR = 1; //访问XFR区域的扩展SFR,需要先将EAXFR(PSW2.7)置1,
P_LED = 0; //LED指示灯亮
P2n_standard(0x08); //LED\P2M1 &= ~(0x08), P2M0 &= ~(0x08)
P3n_standard(0x0f); //串口,P3.2 P3.3,本例未用
P5n_standard(0x0c); //P5.2 P5.3用于测试指示
adc11 = 0;
PWMA_config();
PWMB_config();
ADC_config();
Timer0_config(); //Timer0初始化函数
PWW_Set = 0;
EA= 1; // 打开总中断
while (1)
{
if(B_4ms) // 4ms时隙
{
B_4ms = 0;
adc11 = (adc11 *3)/4 + Get_ADC12bitResult(11); //低通滤波结果为14位
YouMen= adc11 >> 5; //油门是9位的, P0.3 ADC11-->控制电位器输入
if(YouMen >= 256) PWW_Set = YouMen - 256, B_direct = 0; //顺时针, PWM设置值0~255
else PWW_Set = 255 - YouMen, B_direct = 1; //逆时针, PWM设置值0~255
if(!B_RUN && (PWW_Set >= 30)) // PWM_Set >= 30, 并且电机未运行, 则启动电机
{
P_LED = 0; //LED指示灯亮
PWM_Value= 30; //启动电机的最低PWM, 根据具体电机而定
PWMA_CCR1L = PWM_Value; //输出PWM
PWMA_CCR2L = PWM_Value;
PWMA_CCR3L = PWM_Value;
B_RUN = 1; //标注运行
StepMotor(); //启动换相
}
if(B_RUN) //正在运行中
{
P_LED = 0; //LED指示灯亮
if(PWM_Value < PWW_Set) PWM_Value++; //油门跟随电位器, 调速柔和
if(PWM_Value > PWW_Set) PWM_Value--;
if(PWM_Value < 20) // 停转
{
B_RUN = 0;
PWMB_IER = 0;
PWMB_CCER1 = 0;
PWMB_CCER2 = 0;
PWM_Value= 0;
PWMA_ENO = 0;
PWMA_CCR1L = 0;
PWMA_CCR2L = 0;
PWMA_CCR3L = 0;
PWM1_L=0;
PWM2_L=0;
PWM3_L=0;
}
else
{
PWMA_CCR1L = PWM_Value;
PWMA_CCR2L = PWM_Value;
PWMA_CCR3L = PWM_Value;
}
}
else
{
if(++cnt500ms == 125) //500ms
{
cnt500ms = 0;
P_LED = ~P_LED; //LED指示灯闪烁, 待机
}
}
}
}
}
梁工
发表于 2024-8-11 17:12:26
垂柳工作室 发表于 2024-8-10 22:55
请大佬详解一下红线这一句,不理解哦。电位器调到中间不动,程序开始运行时adc11 =0,进入主循环后,adc11...
那是数字一阶低通滤波程序,a=0.25,fc/fs = a/2pi = 0.04。
数字一阶低通滤波对应的是模拟电路的一节RC滤波。
lookuper
发表于 2024-8-11 21:14:52
本帖最后由 lookuper 于 2024-8-11 21:19 编辑
梁工你好,按照你的原理图,画了板子,可以正常工作,试了两种电机都可以工作!UWV的波形也不错,用模拟示波器看的。
但是,发现了一个问题,就是用钳子夹住电机轴,模拟堵转,驱动器还有输出,通过串口输出PhaseTime的数值,发现堵转时PhaseTime是有数值的,在500-600左右跳动,所以程序认为不是堵转,会继续换相,这大概应该是什么原因呢?是堵转时还有反电动势?
梁工
发表于 2024-8-12 09:24:49
lookuper 发表于 2024-8-11 21:14
梁工你好,按照你的原理图,画了板子,可以正常工作,试了两种电机都可以工作!UWV的波形也不错,用模拟示 ...
PWM干扰到反电动势检测了,误以为有反电动势,这个要软件处理了。我的例子用于提供入门学习,比较简单,没有过多的检测处理。
lookuper
发表于 2024-8-12 10:16:30
梁工 发表于 2024-8-12 09:24
PWM干扰到反电动势检测了,误以为有反电动势,这个要软件处理了。我的例子用于提供入门学习,比较简单, ...
你自己做的板子有这种现象吗?