브러시 DC 모터 PWM 제어 시뮬레이션
16883 단어 PWMMotorPythonSimulation모터 제어
스텝 입력을 적용할 때와 PWM의 점유율이 점차 상승할 때 각각 시뮬레이션을 한다.
모델링
다음은 모터의 미분 방정식에 대한 해답을 드리겠습니다.즉 적분식을 구하는 것이다.
그러나 시뮬레이션에서 미분 방정식을 직접 사용하기 때문에 적분식을 원하는 사람 이외의 사람은 모두 뛰어넘을 수 있다.
회로 방정식
우선 모터의 모델링이다.
전압 v(t)를 가하는 브러시 DC 모터의 등가 회로는 다음 그림과 같습니다.
저항 R, 감지 L, 반전동력 e(t)로 마다네를 나타내는 요소다.
이 회로의 미분 방정식은 다음과 같다.v(t)=L \frac{d i(t)}{d t}+R i(t)+e(t)
이 미분 방정식의 해를 구하다.
상수 변화법에 따라 해결하면
우선 차례차례L \frac{d i(t)}{d t}+R i(t)=0
라는 답변을 남겼다.i(t)=C e^{-\frac{R}{L} t} (Cは積分定数)
따라서 여기에 포인트 상수 C를 C1(t)로 설정합니다.i(t)=C_{1}(t) e^{-\frac{R}{L} t}
네.이 미분\frac{d i(t)}{d t}=\frac{d C_{1}(t)}{d t} e^{-\frac{R}{L} t}-\frac{R}{L} C_{1}(t) e^{-\frac{R}{L} t}
첫 번째 공식을 각각 대체하다v(t)-e(t)=L \frac{d C_{1}(t)}{d t} e^{-\frac{R}{L} t}
얻을 수 있다.
C1 풀면 (t)C_{1}(t)=\int_{0}^{t} \frac{1}{L}\{v(\tau)-e(\tau)\} e^{\frac{R}{L} \tau} d \tau+C_{1} (C_{1}は積分定数)
.하면, 만약, 만약...i(t)=e^{-\frac{R}{L} t}\left\{\int_{0}^{t} \frac{1}{L}\{v(\tau)-e(\tau)\} e^{\frac{R}{L} \tau} d \tau+C_{1}\right\}
i(t)식을 구하다.
하지만 아직 끝나지 않았다.
역전동세 e(t)의 공식을 구해야 한다.
역전동력 e(t)는 모터의 각속도와 비례하여 다음과 같은 공식으로 표시한다.K는 역전압 상수다.e(t)=K \omega(t)
기계계 운동 방정식
ω(t)를 찾기 위해 브러시 DC 모터의 기계 모델링을 진행한다.
그림과 같이 브러시 DC 모터를 입력 토크 T(t)의 축으로 사용합니다.
이 기계 시스템의 미분 방정식은 아래의 공식으로 표시한다.T(t)=J \frac{d \omega(t)}{d t}+D \omega(t)
상수변화법으로 해결하면 마찬가지로C_{2}(t)=\int_{0}^{t} \frac{1}{J} T(\tau) e^{\frac{D}{J} \tau} d \tau+C_{2}
\omega(t)=e^{-\frac{D}{J} t}\left\{\int_{0}^{t} \frac{1}{J} T(\tau) e^{\frac{D}{J} \tau} d \tau+C_{2}\right\} (C_{2}は積分定数)
및ω(t)식을 얻었다.
또한 T(t)는 전류 i(t)와 비례하여 다음 공식으로 표시한다.T(t)=K i(t)
공식 요약
미분계
이번에 사용한 건 이거예요.v(t)=L \frac{d i(t)}{d t}+R i(t)+e(t)
e(t)=K \omega(t)
T(t)=J \frac{d \omega(t)}{d t}+D \omega(t)
T(t)=K i(t)
포인트 시스템
i(t)=e^{-\frac{R}{L} t}\left[\int_{0}^{t} \frac{1}{L}\{v(\tau)-e(\tau)\} e^{\frac{R}{L} \tau} d \tau+C_{1}\right]
e(t)=K \omega(t)
\omega(t)=e^{-\frac{D}{J} t}\left[\int_{0}^{t} \frac{1}{J} T(\tau) e^{\frac{D}{J} \tau} d \tau+C_{2}\right]
T(t)=K i(t)
모방하다
단계 응답과 PWM에서 입력한 응답을 각각 시뮬레이션합니다.
python으로 코드를 써서 실행합니다.
scipy로 시뮬레이션하고, 그림은 matplotlib으로 출력합니다.
코드
공중 점유율은 0.5이다.
MotorSim.pyfrom scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt
# maxon RE40 グラファイトブラシ, 150 Watt 製品番号 148867
R = 0.299 #[Ω]
L = 0.082e-3 #[H]
J = 142.0e-7 #[kgm^2]
tau_m = 4.67e-3 #[sec]
D = J/tau_m #[Nm sec/rad]
E = 24.0 #[V]
K = 30.2e-3 #[Nm/A]
f = 20e+3
def motorStep(var, t):
i = var[0]
omega = var[1]
e = K*omega
T = K*i
if t < 0.000002:
v = 0
else:
v = E
didt = 1/L * (v - R*i - e)
domegadt = 1/J * (T - D*omega)
return [didt, domegadt]
def motorFromPWM(var, t):
i = var[0]
omega = var[1]
e = K*omega
T = K*i
if t < 0.000002:
pwm = 0.0
else:
pwm = ( (np.sin(2*np.pi*f*t)+0.9999) ).astype(np.int)*E
pwm = pwm.astype(np.float)
didt = 1/L * (pwm - R*i - e)
domegadt = 1/J * (T - D*omega)
return [didt, domegadt]
var_0 = [0.0, 0.0]
t = np.arange(0, 0.1, 0.000001)
var_list_step = odeint(motorStep, var_0, t)
var_list_pwm = odeint(motorFromPWM, var_0, t)
fig, ax = plt.subplots(1,2)
ax[0].plot(t, var_list_step[:, 0], label='step', ls='-')
ax[0].plot(t, var_list_pwm[:, 0], label='pwm', ls='-.')
ax[0].set_xlabel('t')
ax[0].set_ylabel('i[A]')
ax[0].legend(loc='best')
ax[0].grid(ls=':')
ax[0].set_title('Current')
ax[1].plot(t, var_list_step[:, 1]*60/(2*np.pi), label='step', ls='-')
ax[1].plot(t, var_list_pwm[:, 1]*60/(2*np.pi), label='pwm', ls='-.')
ax[1].set_xlabel('t')
ax[1].set_ylabel('$\omega[rpm]$')
ax[1].legend(loc='best')
ax[1].grid(ls=':')
ax[1].set_title('Speed')
plt.subplots_adjust(wspace=0.4)
plt.savefig('MotorSimResult.png')
시뮬레이션 결과
왼쪽은 전류, 오른쪽은 회전 속도.
점유율을 0.5로 설정했기 때문에 PWM이 제어하면 전류가 약 1/2배 정도 된다.
가동 전류도 제어된다.
실험
완전히 다르지만 모터에서 유통되는 전류를 전류 센서로 읽었다.
모터 RS-540
센서 ACS 714
전압을 8V 정도 가하다
제어는 mbed LPC1768입니다.
실험 결과
간단하게 전압을 찍을 때(왼쪽), 점공비 선형이 상승할 때(오른쪽).
확실히 공중 점유율이 1일 때 가동 전류와 유사한 것이 발생한다.
Reference
이 문제에 관하여(브러시 DC 모터 PWM 제어 시뮬레이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/newlvAlPr/items/739095679cd43100e5ff
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
v(t)=L \frac{d i(t)}{d t}+R i(t)+e(t)
L \frac{d i(t)}{d t}+R i(t)=0
i(t)=C e^{-\frac{R}{L} t} (Cは積分定数)
i(t)=C_{1}(t) e^{-\frac{R}{L} t}
\frac{d i(t)}{d t}=\frac{d C_{1}(t)}{d t} e^{-\frac{R}{L} t}-\frac{R}{L} C_{1}(t) e^{-\frac{R}{L} t}
v(t)-e(t)=L \frac{d C_{1}(t)}{d t} e^{-\frac{R}{L} t}
C_{1}(t)=\int_{0}^{t} \frac{1}{L}\{v(\tau)-e(\tau)\} e^{\frac{R}{L} \tau} d \tau+C_{1} (C_{1}は積分定数)
i(t)=e^{-\frac{R}{L} t}\left\{\int_{0}^{t} \frac{1}{L}\{v(\tau)-e(\tau)\} e^{\frac{R}{L} \tau} d \tau+C_{1}\right\}
e(t)=K \omega(t)
T(t)=J \frac{d \omega(t)}{d t}+D \omega(t)
C_{2}(t)=\int_{0}^{t} \frac{1}{J} T(\tau) e^{\frac{D}{J} \tau} d \tau+C_{2}
\omega(t)=e^{-\frac{D}{J} t}\left\{\int_{0}^{t} \frac{1}{J} T(\tau) e^{\frac{D}{J} \tau} d \tau+C_{2}\right\} (C_{2}は積分定数)
T(t)=K i(t)
미분계
이번에 사용한 건 이거예요.
v(t)=L \frac{d i(t)}{d t}+R i(t)+e(t)
e(t)=K \omega(t)
T(t)=J \frac{d \omega(t)}{d t}+D \omega(t)
T(t)=K i(t)
포인트 시스템
i(t)=e^{-\frac{R}{L} t}\left[\int_{0}^{t} \frac{1}{L}\{v(\tau)-e(\tau)\} e^{\frac{R}{L} \tau} d \tau+C_{1}\right]
e(t)=K \omega(t)
\omega(t)=e^{-\frac{D}{J} t}\left[\int_{0}^{t} \frac{1}{J} T(\tau) e^{\frac{D}{J} \tau} d \tau+C_{2}\right]
T(t)=K i(t)
모방하다
단계 응답과 PWM에서 입력한 응답을 각각 시뮬레이션합니다.
python으로 코드를 써서 실행합니다.
scipy로 시뮬레이션하고, 그림은 matplotlib으로 출력합니다.
코드
공중 점유율은 0.5이다.
MotorSim.pyfrom scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt
# maxon RE40 グラファイトブラシ, 150 Watt 製品番号 148867
R = 0.299 #[Ω]
L = 0.082e-3 #[H]
J = 142.0e-7 #[kgm^2]
tau_m = 4.67e-3 #[sec]
D = J/tau_m #[Nm sec/rad]
E = 24.0 #[V]
K = 30.2e-3 #[Nm/A]
f = 20e+3
def motorStep(var, t):
i = var[0]
omega = var[1]
e = K*omega
T = K*i
if t < 0.000002:
v = 0
else:
v = E
didt = 1/L * (v - R*i - e)
domegadt = 1/J * (T - D*omega)
return [didt, domegadt]
def motorFromPWM(var, t):
i = var[0]
omega = var[1]
e = K*omega
T = K*i
if t < 0.000002:
pwm = 0.0
else:
pwm = ( (np.sin(2*np.pi*f*t)+0.9999) ).astype(np.int)*E
pwm = pwm.astype(np.float)
didt = 1/L * (pwm - R*i - e)
domegadt = 1/J * (T - D*omega)
return [didt, domegadt]
var_0 = [0.0, 0.0]
t = np.arange(0, 0.1, 0.000001)
var_list_step = odeint(motorStep, var_0, t)
var_list_pwm = odeint(motorFromPWM, var_0, t)
fig, ax = plt.subplots(1,2)
ax[0].plot(t, var_list_step[:, 0], label='step', ls='-')
ax[0].plot(t, var_list_pwm[:, 0], label='pwm', ls='-.')
ax[0].set_xlabel('t')
ax[0].set_ylabel('i[A]')
ax[0].legend(loc='best')
ax[0].grid(ls=':')
ax[0].set_title('Current')
ax[1].plot(t, var_list_step[:, 1]*60/(2*np.pi), label='step', ls='-')
ax[1].plot(t, var_list_pwm[:, 1]*60/(2*np.pi), label='pwm', ls='-.')
ax[1].set_xlabel('t')
ax[1].set_ylabel('$\omega[rpm]$')
ax[1].legend(loc='best')
ax[1].grid(ls=':')
ax[1].set_title('Speed')
plt.subplots_adjust(wspace=0.4)
plt.savefig('MotorSimResult.png')
시뮬레이션 결과
왼쪽은 전류, 오른쪽은 회전 속도.
점유율을 0.5로 설정했기 때문에 PWM이 제어하면 전류가 약 1/2배 정도 된다.
가동 전류도 제어된다.
실험
완전히 다르지만 모터에서 유통되는 전류를 전류 센서로 읽었다.
모터 RS-540
센서 ACS 714
전압을 8V 정도 가하다
제어는 mbed LPC1768입니다.
실험 결과
간단하게 전압을 찍을 때(왼쪽), 점공비 선형이 상승할 때(오른쪽).
확실히 공중 점유율이 1일 때 가동 전류와 유사한 것이 발생한다.
Reference
이 문제에 관하여(브러시 DC 모터 PWM 제어 시뮬레이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/newlvAlPr/items/739095679cd43100e5ff
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt
# maxon RE40 グラファイトブラシ, 150 Watt 製品番号 148867
R = 0.299 #[Ω]
L = 0.082e-3 #[H]
J = 142.0e-7 #[kgm^2]
tau_m = 4.67e-3 #[sec]
D = J/tau_m #[Nm sec/rad]
E = 24.0 #[V]
K = 30.2e-3 #[Nm/A]
f = 20e+3
def motorStep(var, t):
i = var[0]
omega = var[1]
e = K*omega
T = K*i
if t < 0.000002:
v = 0
else:
v = E
didt = 1/L * (v - R*i - e)
domegadt = 1/J * (T - D*omega)
return [didt, domegadt]
def motorFromPWM(var, t):
i = var[0]
omega = var[1]
e = K*omega
T = K*i
if t < 0.000002:
pwm = 0.0
else:
pwm = ( (np.sin(2*np.pi*f*t)+0.9999) ).astype(np.int)*E
pwm = pwm.astype(np.float)
didt = 1/L * (pwm - R*i - e)
domegadt = 1/J * (T - D*omega)
return [didt, domegadt]
var_0 = [0.0, 0.0]
t = np.arange(0, 0.1, 0.000001)
var_list_step = odeint(motorStep, var_0, t)
var_list_pwm = odeint(motorFromPWM, var_0, t)
fig, ax = plt.subplots(1,2)
ax[0].plot(t, var_list_step[:, 0], label='step', ls='-')
ax[0].plot(t, var_list_pwm[:, 0], label='pwm', ls='-.')
ax[0].set_xlabel('t')
ax[0].set_ylabel('i[A]')
ax[0].legend(loc='best')
ax[0].grid(ls=':')
ax[0].set_title('Current')
ax[1].plot(t, var_list_step[:, 1]*60/(2*np.pi), label='step', ls='-')
ax[1].plot(t, var_list_pwm[:, 1]*60/(2*np.pi), label='pwm', ls='-.')
ax[1].set_xlabel('t')
ax[1].set_ylabel('$\omega[rpm]$')
ax[1].legend(loc='best')
ax[1].grid(ls=':')
ax[1].set_title('Speed')
plt.subplots_adjust(wspace=0.4)
plt.savefig('MotorSimResult.png')
완전히 다르지만 모터에서 유통되는 전류를 전류 센서로 읽었다.
모터 RS-540
센서 ACS 714
전압을 8V 정도 가하다
제어는 mbed LPC1768입니다.
실험 결과
간단하게 전압을 찍을 때(왼쪽), 점공비 선형이 상승할 때(오른쪽).
확실히 공중 점유율이 1일 때 가동 전류와 유사한 것이 발생한다.
Reference
이 문제에 관하여(브러시 DC 모터 PWM 제어 시뮬레이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/newlvAlPr/items/739095679cd43100e5ff텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)