source: rc_autosar_rh850/trunk/os-application/RcCar.c@ 112

Last change on this file since 112 was 112, checked in by ertl-honda, 9 years ago

最初のリリースファイルの追加

File size: 6.2 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2014-2015 by Center for Embedded Computing Systems
6 * Graduate School of Information Science, Nagoya Univ., JAPAN
7 * Copyright (C) 2014-2015 by FUJI SOFT INCORPORATED, JAPAN
8 *
9 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14 * スコード中に含まれていること.
15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
18 * の無保証規定を掲載すること.
19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
20 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
21 * と.
22 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
23 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
24 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
25 * 報告すること.
26 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
27 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
28 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
29 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
30 * 免責すること.
31 *
32 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
33 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
34 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
35 * 用する者に対して,AUTOSARパートナーになることを求めている.
36 *
37 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
38 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
39 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
40 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
41 * の責任を負わない.
42 *
43 * $Id: rc_car.h 20 2015-04-20 14:29:19Z honda $
44 */
45
46/*
47 * RC-CAR関連
48 */
49
50#include "Os.h"
51#include "ModelCarControl.h"
52#include "t_syslog.h"
53#include "rc.h"
54
55/*
56 * PWMの周期
57 */
58#define PWM_CYCLE_US 20000
59
60/*
61 * ステアリング値/車速/ブレーキの指令値
62 */
63volatile boolean brake_val = FALSE;
64volatile int speed_val = 0;
65volatile float angle_val = 0;
66
67/*
68 * ステアリング値と車速のPWM値
69 */
70static sint32 servo_pwm = SERVO_N_US;
71static sint32 esc_pwm_100nsec = ESC_N_100NS;
72
73/*
74 * RC-CAR用の初期化
75 */
76void
77RcCarInit(void)
78{
79 tInitPWM(PWM_CYCLE_US, SERVO_N_US, ESC_N_100NS/10);
80}
81
82/*
83 * ステアリング値設定用API
84 */
85void
86SetSteerAngle(sint8 angle)
87{
88 if ((angle <= STEER_ANGLE_MAX) && (angle >= STEER_ANGLE_MIN)) {
89 angle_val = angle;
90 }
91}
92
93/*
94 * 車速設定用API
95 */
96void
97SetDriveSpeed(sint8 speed)
98{
99 if ((speed <= DRIVE_SPEED_MAX) && (speed >= DRIVE_SPEED_MIN)) {
100 speed_val = speed;
101 }
102}
103
104/*
105 * ブレーキ値設定用API
106 */
107void
108SetBrake(boolean brake)
109{
110 brake_val = brake;
111}
112
113/*
114 * ESCの制御状態
115 */
116typedef enum {
117 DRIVE_STATE_DRIVE,
118 DRIVE_STATE_REVERSE,
119 DRIVE_STATE_DNEUTRAL,
120 DRIVE_STATE_NEUTRAL,
121 DRIVE_STATE_DRIVE2REVERSE,
122 DRIVE_STATE_DRIVE2BRAKE,
123 DRIVE_STATE_REVERSE2BRAKE,
124}DRIVE_STATE;
125
126/*
127 * パワートレインタスク
128 */
129TASK(PowerTrainTask)
130{
131 static boolean executed = FALSE;
132 static uint8 adjust_cnt = 0U;
133 static boolean pre_brake_val = FALSE;
134 static DRIVE_STATE drive_state = DRIVE_STATE_NEUTRAL;
135
136 /* 初回起動時のみ実行 */
137 if (executed == FALSE) {
138 syslog(LOG_INFO, "PowerTrainTask : Start!");
139 executed = TRUE;
140 }
141
142 /*
143 * ステアリング制御
144 */
145 if ((angle_val <= STEER_ANGLE_MAX) && (angle_val >= STEER_ANGLE_MIN)) {
146 if (angle_val >= 0) {
147 servo_pwm = SERVO_N_US - ((((SERVO_N_US - SERVO_LMAX_US) * 100) / (64 * 100)) * angle_val);
148 }
149 else {
150 servo_pwm = SERVO_N_US + ((((SERVO_RMAX_US - SERVO_N_US) * 100) / (64 * 100)) * (-angle_val));
151 }
152 /* ステアリング値設定 */
153 tChangeServoDuty(servo_pwm);
154 }
155
156 /*
157 * 車速制御
158 */
159 if (adjust_cnt != 0U) {
160 adjust_cnt--;
161 if(adjust_cnt == 0){
162 if(drive_state == DRIVE_STATE_REVERSE2BRAKE) {
163 tChangeESCDuty100NS(ESC_BREAK_100NS);
164 }
165 if(drive_state == DRIVE_STATE_DRIVE2REVERSE){
166 drive_state = DRIVE_STATE_REVERSE;
167 adjust_cnt = ESC_WAIT_N2R_WAIT_10MS;
168 tChangeESCDuty100NS(ESC_N_100NS);
169 }
170 }
171 }
172 else if (pre_brake_val != brake_val) {
173 /* ブレーキ状態が変化 */
174 pre_brake_val = brake_val;
175 /* ブレーキ開放 */
176 if (brake_val == FALSE) {
177 if (speed_val < 0) {
178 drive_state = DRIVE_STATE_REVERSE;
179 adjust_cnt = ESC_WAIT_N2R_WAIT_10MS;
180 tChangeESCDuty100NS(ESC_N_100NS);
181 }
182 }
183 else {
184 /* ブレーキ */
185 if((drive_state == DRIVE_STATE_DRIVE) || (drive_state == DRIVE_STATE_DNEUTRAL)) {
186 drive_state = DRIVE_STATE_DRIVE2BRAKE;
187 tChangeESCDuty100NS(ESC_BREAK_100NS);
188 }
189 else if((drive_state == DRIVE_STATE_REVERSE) || (drive_state == DRIVE_STATE_NEUTRAL)) {
190 drive_state = DRIVE_STATE_REVERSE2BRAKE;
191 adjust_cnt = ESC_WAIT_D2B_WAIT_10MS;
192 tChangeESCDuty100NS(ESC_DTH_100NS);
193 }
194 }
195 }
196 else if (brake_val == FALSE) {
197 /* 車速判定 */
198 if ((speed_val <= DRIVE_SPEED_MAX) && (speed_val >= DRIVE_SPEED_MIN)) {
199 /* 前進から後退に切り替わった場合 */
200 if ((drive_state == DRIVE_STATE_DNEUTRAL) && (speed_val < 0)) {
201 drive_state = DRIVE_STATE_DRIVE2REVERSE;
202 adjust_cnt = ESC_WAIT_D2NR_WAIT_10MS;
203 tChangeESCDuty100NS(ESC_D2R_100NS);
204 }
205 else {
206 /* 前進 */
207 if (speed_val > 0) {
208 esc_pwm_100nsec = ESC_DTH_100NS + (((ESC_DTH_100NS - ESC_DMAX_100NS) / 64) * (-1) * speed_val);
209 drive_state = DRIVE_STATE_DRIVE;
210 }
211 /* ニュートラル */
212 if (speed_val == 0) {
213 esc_pwm_100nsec = ESC_N_100NS;
214 if (drive_state == DRIVE_STATE_DRIVE) {
215 drive_state = DRIVE_STATE_DNEUTRAL;
216 } else if (drive_state != DRIVE_STATE_DNEUTRAL){
217 drive_state = DRIVE_STATE_NEUTRAL;
218 }
219 }
220 /* 後退 */
221 if (speed_val < 0) {
222 esc_pwm_100nsec = ESC_RTH_100NS + (((ESC_RMAX_100NS - ESC_RTH_100NS) / 64) * (-1) * speed_val);
223 drive_state = DRIVE_STATE_REVERSE;
224 }
225 /* 車速値設定 */
226 tChangeESCDuty100NS(esc_pwm_100nsec);
227 }
228 }
229 }
230
231 TerminateTask();
232}
Note: See TracBrowser for help on using the repository browser.