Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 无传感器无刷直流电机控制反电势部分_Arduino_Stm32_Atmel - Fatal编程技术网

Arduino 无传感器无刷直流电机控制反电势部分

Arduino 无传感器无刷直流电机控制反电势部分,arduino,stm32,atmel,Arduino,Stm32,Atmel,我试图使无传感器无刷直流电机控制驱动器。我找到了一个arduino代码,我想把它转换成ARM Stm32。但我不能完全理解ISR中断部分发生了什么。谁能马上给我解释一下吗。为什么使用(bldc_步骤&1)以及何时减少i。 谢谢你的帮助。(已删除部分代码) 字节bldc_步进=0,电机转速,引脚状态; 无效设置() { DDRD |=0xE0;//将引脚5、6和7配置为输出 端口D=0x00; DDRB |=0x0E;//将引脚9、10和11配置为输出 端口B=0x31; 引脚模式(2,输入\上

我试图使无传感器无刷直流电机控制驱动器。我找到了一个arduino代码,我想把它转换成ARM Stm32。但我不能完全理解ISR中断部分发生了什么。谁能马上给我解释一下吗。为什么使用(bldc_步骤&1)以及何时减少i。 谢谢你的帮助。(已删除部分代码)


字节bldc_步进=0,电机转速,引脚状态;
无效设置()
{
DDRD |=0xE0;//将引脚5、6和7配置为输出
端口D=0x00;
DDRB |=0x0E;//将引脚9、10和11配置为输出
端口B=0x31;
引脚模式(2,输入\上拉);
pinMode(3,输入\上拉);
引脚模式(4,输入\上拉);
}
//引脚更改中断2(PCINT2)ISR
行业特殊风险(PCINT2)
{
如果((PIND和PCMSK2)!=引脚状态)
返回;
//反作用力去盎司
用于(字节i=0;i<20;i++)
{
如果(bldc_步骤和1){
如果(PIND&PCMSK2)i-=1;
}
否则{
如果(!(PIND&PCMSK2))i-=1;
}
}
bldc_move();
bldc_step++;
bldc_阶跃%=6;
}
//无刷直流电机换向功能
无效bldc_移动()
{
开关(bldc_步进)
{
案例0:
啊_BL();
反作用力;
打破
案例1:
啊_CL();
BEMF_B_上升();
打破
案例2:
BH_CL();
BEMF_A_FALLING();
打破
案例3:
BH_AL();
反作用力;
打破
案例4:
丘阿尔();
BEMF_B_FALLING();
打破
案例5:
Chubl();
反作用力上升;
}
}
PCICR=4;//为插脚PCINT23..16(Arduino 0至7)启用插脚更改中断
无效反电势上升()
{
PCMSK2=0x04;//启用Arduino引脚2(PCINT18)中断,其他中断被禁用
引脚_状态=0x04;
}
void BEMF_A_FALLING()
{
PCMSK2=0x04;//启用Arduino引脚2(PCINT18)中断,其他中断被禁用
引脚_状态=0;
}
无效BEMF_B_上升()
{
PCMSK2=0x08;//启用Arduino引脚3(PCINT19)中断,其他中断被禁用
引脚_状态=0x08;
}
void BEMF_B_FALLING()
{
PCMSK2=0x08;//启用Arduino引脚3(PCINT19)中断,其他中断被禁用
引脚_状态=0;
}
无效反作用力_C_上升()
{
PCMSK2=0x10;//启用Arduino引脚4(PCINT20)中断,其他中断被禁用
引脚_状态=0x10;
}
void BEMF_C_FALLING()
{
PCMSK2=0x10;//启用Arduino引脚4(PCINT20)中断,其他中断被禁用
引脚_状态=0;
}
void AH_BL()
{
端口d&=~0xA0;
端口d |=0x40;
TCCR1A=0;//将针脚11(OC2A)PWM接通(针脚9和针脚10断开)
TCCR2A=0x81//
}
void AH_CL()
{
端口d&=~0xC0;
端口d |=0x20;
TCCR1A=0;//将针脚11(OC2A)PWM接通(针脚9和针脚10断开)
TCCR2A=0x81//
}
void BH_CL()
{
端口d&=~0xC0;
端口d |=0x20;
TCCR2A=0;//接通针脚10(OC1B)PWM(针脚9和针脚11断开)
TCCR1A=0x21//
}
void BH_AL()
{
端口d&=~0x60;
端口d |=0x80;
TCCR2A=0;//接通针脚10(OC1B)PWM(针脚9和针脚11断开)
TCCR1A=0x21//
}
void chu AL()
{
端口d&=~0x60;
端口d |=0x80;
TCCR2A=0;//接通针脚9(OC1A)PWM(针脚10和针脚11断开)
TCCR1A=0x81//
}
无效CHU BL()
{
端口d&=~0xA0;
端口d |=0x40;
TCCR2A=0;//接通针脚9(OC1A)PWM(针脚10和针脚11断开)
TCCR1A=0x81//
}
无效设置\脉宽调制\占空比(字节占空比)
{
OCR1A=占空比;//设置引脚9 PWM占空比
OCR1B=占空比;//设置引脚10 PWM占空比
OCR2A=占空比;//设置引脚11 PWM占空比
}
此代码用于消除反向电磁力(BEMF)信号的抖动,等效代码为

ISR(分析比较){
无符号字符i;
/*反电势信号去抖动*/

对于(i=0;i而言,电机的速度取决于施加的电压D.V,其中D为占空比

Fm = D.VP.KV.poles/120 = D.Vp/M
Tm = M/(D.Vp)
反电动势检测后的理想延迟为30度:

delay = Tm/12 = M/(12.D.Vp) = M'/(D.Vp)     : M'=M/12
过零检测后30°延迟的M’–伏特*秒。 比较器ISR仅在接通时间内计数。PWM脉冲越宽,计数越快。
循环最长时间:

m = N.ticks.Cycles
周期是每条指令的刻度。 回路仅在反电动势上升或下降时计数(最多)到N。计数的PWM脉冲将为:

Pc = m/ton  or  Pc = m/(D.Ts)
循环的估计时间为:

dt = Pc.Ts = m.Ts/(D.Ts) = m/D
所需延迟和环路时间必须相等:延迟=dt

M'/(Vp.D) = m/D or m = M'/Vp
这种方法也称为“反电动势积分法”。 M'=D.Vp.Tm' 是从ZCP到下一次换相的积分反电势。您可以阅读更多 在此简要介绍一下:

调整N和PWM频率(Fs=1/Ts)可以在检测到反电动势后为您提供几乎完美的30度延迟。电机的极性和Kv应该是已知的。如果不进行调整,此代码将不适用于任何电机。 干杯

dt = Pc.Ts = m.Ts/(D.Ts) = m/D
M'/(Vp.D) = m/D or m = M'/Vp