source: rc_autosar_rh850/trunk/driver/taub_pwm.c

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

ID属性の付加.

  • Property svn:keywords set to Id
File size: 7.6 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 *
8 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
9 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
11 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13 * スコード中に含まれていること.
14 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
16 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17 * の無保証規定を掲載すること.
18 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
19 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20 * と.
21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
23 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24 * 報告すること.
25 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
26 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
28 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
29 * 免責すること.
30 *
31 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
32 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
33 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
34 * 用する者に対して,AUTOSARパートナーになることを求めている.
35 *
36 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
37 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
38 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
39 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
40 * の責任を負わない.
41 *
42 * $Id: taub_pwm.c 122 2015-07-17 01:31:28Z ertl-honda $
43 */
44/*
45 * モータ・サーボPWM制御用TAUBドライバ
46 */
47#include "Os.h"
48#include "v850_gcc/rh850_f1l.h"
49#include "taub_pwm.h"
50#include "target_sysmod.h"
51
52/*
53 * 使用するユニットとチャネル
54 */
55#define PWM_TAUB_UNIT 0
56#define PWM_TAUB_MASTER_CH 0
57#define PWM_TAUB_SERVO_CH 8
58#define PWM_TAUB_ESC_CH 10
59
60/*
61 * Port 0 Configration for TAUB0 channel 8 and 10
62 * P0_11 : TAUB0O8 : 第3兼用
63 * P0_12 : TAUB010 : 第3兼用
64 */
65#define PWM_P0_MASK ((uint16) 0x1800)
66#define PWM_PMC0_INIT ((uint16) 0x1800)
67#define PWM_PFCAE0_INIT ((uint16) 0x0000)
68#define PWM_PFCE0_INIT ((uint16) 0x1800)
69#define PWM_PFC0_INIT ((uint16) 0x0000)
70#define PWM_PM0_INIT ((uint16) 0x0000)
71
72/*
73 * 出力ポートを有効に
74 */
75static void
76init_pwm_port(void)
77{
78 uint16 wk;
79
80 /*
81 * PORT0(PWM)
82 */
83 /* PFCAE0 設定 */
84 wk = sil_reh_mem((void *) PFCAE(0));
85 wk &= ~PWM_P0_MASK;
86 wk |= (PWM_PFCAE0_INIT & PWM_P0_MASK);
87 sil_wrh_mem((void *) PFCAE(0), wk);
88
89 /* PFCE0 設定 */
90 wk = sil_reh_mem((void *) PFCE(0));
91 wk &= ~PWM_P0_MASK;
92 wk |= (PWM_PFCE0_INIT & PWM_P0_MASK);
93 sil_wrh_mem((void *) PFCE(0), wk);
94
95 /* PFC0 設定 */
96 wk = sil_reh_mem((void *) PFC(0));
97 wk &= ~PWM_P0_MASK;
98 wk |= (PWM_PFC0_INIT & PWM_P0_MASK);
99 sil_wrh_mem((void *) PFC(0), wk);
100
101 /* PMC0 設定 */
102 wk = sil_reh_mem((void *) PMC(0));
103 wk &= ~PWM_P0_MASK;
104 wk |= (PWM_PMC0_INIT & PWM_P0_MASK);
105 sil_wrh_mem((void *) PMC(0), wk);
106
107 /* PM0 設定 */
108 wk = sil_reh_mem((void *) PM(0));
109 wk &= ~PWM_P0_MASK;
110 wk |= (PWM_PM0_INIT & PWM_P0_MASK);
111 sil_wrh_mem((void *) PM(0), wk);
112}
113
114/*
115 * TAUB関連レジスタ
116 */
117#define TAUB_BASE(n) ((uint32) (0xffe30000U + (n * 0x1000U)))
118#define TAUBTPS(n) (TAUB_BASE(n) + 0x240U)
119#define TAUBCDR(n, ch) (TAUB_BASE(n) + (ch * 0x04U))
120#define TAUBCNT(n, ch) (TAUB_BASE(n) + 0x80U + (ch * 0x04U))
121#define TAUBCMOR(n, ch) (TAUB_BASE(n) + 0x200U + (ch * 0x04U))
122#define TAUBCMUR(n, ch) (TAUB_BASE(n) + 0xC0U + (ch * 0x04U))
123#define TAUBTS(n) (TAUB_BASE(n) + 0x1C4)
124#define TAUBTT(n) (TAUB_BASE(n) + 0x1C8U)
125#define TAUBRDE(n) (TAUB_BASE(n) + 0x260U)
126#define TAUBRDM(n) (TAUB_BASE(n) + 0x264U)
127
128#define TAUBTOE(n) (TAUB_BASE(n) + 0x5CU)
129#define TAUBTOM(n) (TAUB_BASE(n) + 0x248U)
130#define TAUBTOC(n) (TAUB_BASE(n) + 0x24CU)
131#define TAUBTOL(n) (TAUB_BASE(n) + 0x040U)
132
133#define US_TO_COUNT(usec) ((usec * (TIMER_CLOCK_HZ/1000)) / 1000)
134#define M100NS_TO_COUNT(usec) (((usec * (TIMER_CLOCK_HZ/1000)) / 1000) / 10)
135
136/*
137 * クロックはCK1を使用
138 */
139#define MCU_TAUB_MASK_CK1 ((uint16) 0xff0f)
140#define MCU_TAUB_CK1 ((uint16) 0x0040) /* 40Mhz / 16 = 2.5Mhz */
141
142/*
143 * タイマクロック周波数(Hz)(2.5MHz)
144 */
145#define TIMER_CLOCK_HZ ((uint32) 2500000)
146
147#define MCU_TAUB_CKS_CK1 (0x01 << 14)
148#define MCU_TAUB_MAS (0x01 << 11)
149#define MCU_TAUB_MD0 (0x01 << 0)
150#define MCU_TAUB_STS (0x04 << 8)
151#define MCU_TAUB_MD_ONECNT (0x04 << 1)
152
153/*
154 * PSM用TAUBの初期化
155 */
156void
157taub_init_pwm(uint32 cycle_us, uint32 servo_duty_us, uint32 esc_duty_us)
158{
159 uint16 wk;
160
161 /* IPERI2 : TAUB0 CPUCLK2 / 1 = 40MHz */
162
163 /* 各タイマの停止 */
164 sil_wrh_mem((void *) TAUBTT(PWM_TAUB_UNIT), (1 << PWM_TAUB_MASTER_CH));
165 sil_wrh_mem((void *) TAUBTT(PWM_TAUB_UNIT), (1 << PWM_TAUB_SERVO_CH));
166 sil_wrh_mem((void *) TAUBTT(PWM_TAUB_UNIT), (1 << PWM_TAUB_ESC_CH));
167
168 /* プリスケーラを設定 */
169 wk = sil_reh_mem((void *) TAUBTPS(PWM_TAUB_UNIT));
170 wk &= MCU_TAUB_MASK_CK1;
171 wk |= MCU_TAUB_CK1;
172 sil_wrh_mem((void *) TAUBTPS(PWM_TAUB_UNIT), wk);
173
174 /* マスタチャネルの設定 */
175 sil_wrh_mem((void *) TAUBCMOR(PWM_TAUB_UNIT, PWM_TAUB_MASTER_CH),
176 (MCU_TAUB_CKS_CK1|MCU_TAUB_MAS|MCU_TAUB_MD0));
177 /* スレーブチャネル : サーボ用 */
178 sil_wrh_mem((void *) TAUBCMOR(PWM_TAUB_UNIT, PWM_TAUB_SERVO_CH),
179 (MCU_TAUB_CKS_CK1|MCU_TAUB_STS|MCU_TAUB_MD_ONECNT|MCU_TAUB_MD0));
180 /* スレーブチャネル : ESC用 */
181 sil_wrh_mem((void *) TAUBCMOR(PWM_TAUB_UNIT, PWM_TAUB_ESC_CH),
182 (MCU_TAUB_CKS_CK1|MCU_TAUB_STS|MCU_TAUB_MD_ONECNT|MCU_TAUB_MD0));
183
184 /* ユーザーモードの設定 */
185 sil_wrb_mem((void *) TAUBCMUR(PWM_TAUB_UNIT, PWM_TAUB_MASTER_CH), 0x00);
186 sil_wrb_mem((void *) TAUBCMUR(PWM_TAUB_UNIT, PWM_TAUB_SERVO_CH), 0x00);
187 sil_wrb_mem((void *) TAUBCMUR(PWM_TAUB_UNIT, PWM_TAUB_ESC_CH), 0x00);
188
189 /* 一斉書き換え禁止 */
190 sil_wrb_mem((void *) TAUBRDE(PWM_TAUB_UNIT),0x00);
191
192 /* チャネル出力モード(スレーブのみ) */
193 sil_wrh_mem((void *) TAUBTOE(PWM_TAUB_UNIT), (1 << PWM_TAUB_SERVO_CH)|(1 << PWM_TAUB_ESC_CH));
194 sil_wrh_mem((void *) TAUBTOM(PWM_TAUB_UNIT), (1 << PWM_TAUB_SERVO_CH)|(1 << PWM_TAUB_ESC_CH));
195 sil_wrh_mem((void *) TAUBTOC(PWM_TAUB_UNIT), 0x00);
196 sil_wrh_mem((void *) TAUBTOL(PWM_TAUB_UNIT), 0x00);
197
198 /* カウンタの初期値を設定 */
199 sil_wrh_mem((void *) TAUBCDR(PWM_TAUB_UNIT, PWM_TAUB_MASTER_CH), US_TO_COUNT(cycle_us));
200 sil_wrh_mem((void *) TAUBCDR(PWM_TAUB_UNIT, PWM_TAUB_SERVO_CH), US_TO_COUNT(servo_duty_us));
201 sil_wrh_mem((void *) TAUBCDR(PWM_TAUB_UNIT, PWM_TAUB_ESC_CH), US_TO_COUNT(esc_duty_us));
202
203 /* PWM動作開始 */
204 sil_wrh_mem((void *) TAUBTS(PWM_TAUB_UNIT),
205 (1 << PWM_TAUB_MASTER_CH)|(1 << PWM_TAUB_SERVO_CH)|(1 << PWM_TAUB_ESC_CH));
206
207 init_pwm_port();
208}
209
210/*
211 * サーボのデューティー比を変更
212 */
213void
214taub_change_servo_duty(uint32 usec)
215{
216 sil_wrw_mem((void *) TAUBCDR(PWM_TAUB_UNIT, PWM_TAUB_SERVO_CH), US_TO_COUNT(usec));
217}
218
219/*
220 * ESCのデューティー比を変更
221 */
222void
223taub_change_esc_duty(uint32 usec)
224{
225 sil_wrw_mem((void *) TAUBCDR(PWM_TAUB_UNIT, PWM_TAUB_ESC_CH), US_TO_COUNT(usec));
226}
227
228/*
229 * ESCのデューティー比を変更(100nsec精度)
230 */
231void
232taub_change_esc_duty_100ns(uint32 nsec)
233{
234 sil_wrw_mem((void *) TAUBCDR(PWM_TAUB_UNIT, PWM_TAUB_ESC_CH), M100NS_TO_COUNT(nsec));
235}
Note: See TracBrowser for help on using the repository browser.