mcf3313
发表于 2023-9-18 19:57:40
视频讲解,梁工在山东大学的STC8H8K64U教学视频课程,这个视频有没有回放。
神农鼎
发表于 2023-9-18 20:15:36
见顶楼的 链接
fisholive
发表于 2023-10-7 21:59:39
梁工,
我在试产发现,这个程序1/10概率不能正常启动, 不得已写了下面重启程序(遇到异常,让马达重启)现在我将正常和非正常启动波形及正常工作波形,都附着附件下面,
我现在不清楚异常启动是什么引起的,有没有办法检测到异常,进行及时修正,避免重启?
if(PhaseTime>=4000)overtime_number++;//小于2500RPM 会堵转计数器会计数
if((PhaseTime <= PhaseTime_average) || (PhaseTime<= 400 ))short_time_number++;//如果相位小于平均值的1/2,将会相位异常计数。
1,此水泵电机应该不是高速电机,消磁我从40us-200us都取值试过,100us好像正常概率高些,我目前取值100us
T2H = (u8)((65536UL - 100*2) >> 8); //装载消磁延时
T2L = (u8)(65536UL - 100*2);
AUXR |=0x10; //Timer2开始运行, 等于延迟100us再检测,比较中断-21,避免触发误检测。
}
else if(XiaoCiCnt == 2) XiaoCiCnt = 0; //1:需要消磁, 2:正在消磁, 0已经消磁
}
2,马达启动程序,我测试过好多次,目前驱动初始值60,驱动概率高些
关于初次赋值,我从示波器开始一个周期波形时间大概是18ms,所以赋值,是,5000+7*2000,这个赋值,我从400到2000都试过,好像差异不大
for(i=0; i<8; i++) PhaseTimeTmp = 2000;
motor_lockedtime=1; TH0 = 0; TL0 = 0;
u8 StartMotor(void)
{
u16 timer,k;
PWM_Value=60;
Step = 0;
StepXL();
DISABLE_CMP_INT;
Delay5ms();Delay5ms();Delay5ms();Delay5ms();
Delay5ms();Delay5ms();Delay5ms();Delay5ms();//40ms,delay_ms(5);
timer = 300;
while(1)
{
for(k=0; k<timer; k++)Delay70us();//
timer -= timer /14+1;
if(timer < 25) return(1);
if(Step<5) Step++;
else Step = 0;
StepXL();
}
if(motor_start_flag==1) //马达启动
{
motor_start_flag=0;
B_start=1;
StartMotor();
for(i=0; i<8; i++) PhaseTimeTmp = 2000;
motor_lockedtime=1; TH0 = 0; TL0 = 0;
motor_RUN=1; XiaoCiCnt = 0; //初始进入时
CMPCR1 &= ~0x40; B_start=0; // 清除中断标志位
if(Step%2==0) CMPCR1 =0x9C; //下降沿中断
else CMPCR1 =0xAC; //上升沿中断
}
3,比较器中断程序, 我将,PhaseTime=0; 从for语句移到外面,不知道是否有影响?
PhaseTime=0;
for(i=0; i<8; i++) PhaseTime += PhaseTimeTmp; //求8次换相时间累加和
void CMP_INT(void) interrupt 21
{
u8 i;
CMPCR1 &= ~0x40; // 需软件清除中断标志位
Red_LED=~Red_LED;
if(XiaoCiCnt == 0)
{
TR0=0; // Timer0停止运行
if( motor_lockedtime==1 ) //切换时间间隔(Timer0)有溢出,中断间隔:32ms
{
motor_lockedtime = 0;
PhaseTime =5000;
}
else
{
PhaseTime = (((u16)TH0 << 8) + TL0) >> 1; // Time0 12T的一个时钟为0.5us, 定时器时间换算单位为us,定时器时间/2
if(PhaseTime >= 5000)PhaseTime=5000;// 一圈360度所用时间= 500us*6 (相数)*2 (2对极/四级转子)=6ms, rpm=1000ms/6ms*60(分钟)=10000,超过转速会保护
}
if(PhaseTime>=4000)overtime_number++;//小于2500RPM 会堵转计数器会计数
if((PhaseTime <= PhaseTime_average) || (PhaseTime<= 400 ))short_time_number++;//如果相位小于平均值的1/2,将会相位异常计数。
TH0 = 0; TL0 = 0;
TR0=1; // Timer0运行
PhaseTimeTmp = PhaseTime; //保存一次换相时间
if(++TimeIndex >= 8) TimeIndex = 0; //累加8次
PhaseTime=0;
for(i=0; i<8; i++) PhaseTime += PhaseTimeTmp; //求8次换相时间累加和
PhaseTime = PhaseTime >> 4; // >>4 = 值/16 ,求8次换相时间的平均值的一半, 即30度电角度
PhaseTime_average=PhaseTime;// 求8次换相时间的平均值1/2
if( PhaseTime<=312 )over_speed_number++; // 超过8000PRM,计数200次进行保护
if( PhaseTime >= 150) PhaseTime -= 50; //修正由于滤波电容引起的滞后时间,50us的滤波电容滞后时间
else
PhaseTime= 150;
AUXR &=~0x10; //Timer2停止运行
PhaseTime= PhaseTime<< 1; // 2个12T 时钟为计数1us
PhaseTime = 0 - PhaseTime;
T2H = (u8)(PhaseTime >> 8); //装载30度角延时
T2L = (u8)PhaseTime;
AUXR |=0x10; //Timer2开始运行,
XiaoCiCnt = 1; //1:需要消磁, 2:正在消磁, 0已经消磁
}
}
梁工
发表于 2023-10-8 00:00:01
fisholive 发表于 2023-10-7 21:59
梁工,
我在试产发现,这个程序1/10概率不能正常启动, 不得已写了下面重启程序(遇到异常,让马达重 ...
第一个图的消磁时间是100us左右,你用100%占空比看看消磁时间,可能会更长,按最长的时间+20%来设定消磁时间。
水泵电机转速慢,启动时要慢一些。
fisholive
发表于 2023-10-8 10:01:09
梁工,
我以前波形杂波很多,从开关电源出来直接接控制板,PWM取值245以上就波形变形,失真,并容易重启。
现在给控制板前端并联22uf贴片电容,波型有很大改善,也干净不少,这次测试占空比250,255也能运行。
我刚看了满占空比255,怎么没有反向电动势波形了尼?
梁工
发表于 2023-10-8 14:49:32
fisholive 发表于 2023-10-8 10:01
梁工,
我以前波形杂波很多,从开关电源出来直接接控制板,PWM取值245以上就波形变形,失真,并容易重启。
...
主电源一定要良好退耦,一般建议使用2个或2个以上470uF低ESR的电容并联使用,否则由于退耦不良会有各种问题出现。
图上看退磁时间达到200us了,你得有超过250us的延时避开退磁再开始过0检测。
占空比255时没看到图,正常的话,会有明显的、最长的退磁时间,有明显的线性上升或下降的反电动势(梯形波)。
下图为我的2212电机最高速时电枢的电压波形,窄脉冲就是退磁时间(航模2212电机非常短,一般并不超过50us),有斜率的就是反电动势。
fisholive
发表于 2023-10-8 17:43:24
梁工,
我将消磁时间改为250us,不启动概率比以前还高,如果能正常启动没有什么区别。
我把正常启动及不正常启动做了对比图,特别是第一次换相时间,正常波形明显比非正常启动波形要宽,会不会换相时机不对,或相位错乱了?
chuchuda
发表于 2023-10-19 22:10:38
这个还是不错的
永亮电器
发表于 2023-10-20 16:38:31
我下载官方的程序,如果采用无感就不能启动电机。如果采用霍尔电机可以启动,在低速度(电流250mA以下)时大概每几十秒电机会卡一下,然后继续运转,如果调高转速可能几秒就卡死,电流很大用手不能转动电机。最低运转电流70mA。我使用的电压是24V。我的板是可以插上别的芯片,我换别的单片机就相当正常低速电流只有30mA,高速电流650mA,120W的电机。我是用EG2132替换了官方的三极管驱动电路,不改程序。请问师傅们,我现在要检查那部分?
永亮电器
发表于 2023-10-20 16:54:22
我的电机是60度霍尔