source: rc_autosar_rh850/trunk/swc-application/common/swcs/CddRcCar.c@ 122

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

ID属性の付加.

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