主题中讨论的其他器件:LM331、
你好! 我尝试将具有 PWM 的分立式 PID 用于 BLDC 电机、我获取电机速度的方法是通过我自己构建的编码器、 而光耦合器生成的频率变为 LM331 (电压转换效率)、 对于生成的电压、我尝试通过 ADC10获取电机速度、但问题是我的 PID 执行它所需的任何操作、即使它忽略了我的设定点。 我检查了其他现有代码(来自其他微控制器)、它们看起来运行良好、我想说的是、PID 已经使用 Ziegler-Nichols 方法进行了调整。
#include "io430.h"
unsigned int adc、v、out;
float sp=380;//等效电压来自"x"量的 Hz 或 RPM
float ak=0、ak_1_0、ek=0、ek_1_0、ek_2=0、ki=0、kp=0、kp=0、kd=0、q0=0、q0=0、q1=0、q2=0、q2=0、ti=0、td=0;
float u=0、u_1=0;
float T = 0.0002;
float Thao = 1.2、theta =.5、k=.958;
int main( void )
{
BCSCTL1 = CALBC1_16MHz;
DCOCTL = CALDCO_16MHz;
WDTCTL = WDTPW + WDTHOLD;
_bis_SR_register (GIE);
/*P1SEL = 0x00;
P1DIR |= BIT0;*/
TACTL = tassel_2+MC_1+TAIE;
TACCR0 = 10666;//采样频率5kHz
TA1CTL = tassel_1+MC_1;
TA1CCR0 =385; //85Hz PWM
TA1CCTL1 = OUTMOD_7;
P2SEL |= BIT1;
P2DIR |= BIT1;
KP=(1.2*Thao)/(k*theta);
TI=2*theta;
td=0.5*theta;
Q0=KP*(1+T/(2*TI)+TD/T);
Q1-KP*(1-T/(2*ti)+(2*td)/t);
Q2=(KP*TD)/T;
ADC10CTL0=SREF_0+ADC10SHT_3+ADC10IE+ADC10ON;
ADC10CTL1=INCH_0+CONSEQ0;
ADC10AE0 |=BIT0;
while (1)
{
ADC10CTL0 |= ENC+ADC10SC;
}
}
#pragma vector=TIMER0_A1_vector
_interrupt void Timer0 (void){
Switch( TAIV ){
情况2:中断;//未使用 CCR1
情况4:中断;//未使用 CCR2
案例10:
ek=sp-v;
U = u_1 + Q0*EK + Q1*EK_1 + Q2*EK_2;
//if (u >= 3300) u=1500;
//if (u <=0) u=0;
输出= u*385/1500;
EK_2=EK_1;
EK_1=EK-;
u_1=u;
TA1CCR1 = OUT;
中断;
}
}
#pragma vector=ADC10_vector
_interrupt void ADC10 (void){
ADC=ADC10MEM;
V=ADC*3300/1024;
_delay_cycles (500);
}