driver-platform-pwm-des.md 12.7 KB
Newer Older
Y
yinshuqing 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
# PWM<a name="title_PWM_des"></a>

-   [概述](#section1_PWM_des)
    -   [PwmConfig结构体](#section1.1_PWM_des)
-   [接口说明](#section2_PWM_des)
-   [使用指导](#section3_PWM_des)
    -   [使用流程](#section3.1_PWM_des)
    -   [获取PWM设备句柄](#section3.2_PWM_des)
    -   [销毁PWM设备句柄](#section3.3_PWM_des)
    -   [使能](#section3.4_PWM_des)
    -   [禁用](#section3.5_PWM_des)
    -   [设置PWM设备周期](#section3.6_PWM_des)
    -   [设置PWM设备占空时间](#section3.7_PWM_des)
    -   [设置PWM设备极性](#section3.8_PWM_des)
    -   [设置PWM设备参数](#section3.9_PWM_des)
    -   [获取PWM设备参数](#section3.10_PWM_des)

-   [使用实例](#section3_PWM_des)

## 概述<a name="section1_PWM_des"></a>

- PWM是脉冲宽度调制(Pulse Width Modulation)的缩写,是一种对模拟信号电平进行数字编码,转换为脉冲的一种技术。常用于马达控制、背光亮度调节等。

- PWM接口定义了操作PWM设备的通用方法集合,包括:
  - PWM设备句柄获取和销毁。
  - PWM周期、占空比、极性的设置。
  - PWM使能和关闭。
  - PWM配置信息的获取和设置

### PwmConfig结构体<a name="section1.1_PWM_des"></a>

**表1**  PwmConfig结构体介绍

<a name="table1_PWM_des"></a>

| 名称     | 描述                                                         |
| -------- | ------------------------------------------------------------ |
| duty     | 占空时间,以纳秒为单位                                       |
| period   | PWM周期,以纳秒为单位                                        |
| number   | 要生成的方波数。正值表示将生成指定数量的方波,<b>0</b>表示方波将不断产生 |
| polarity | 极性:正极性/反极性                                          |
| status   | 状态:启用状态/禁用状态                                      |

## 接口说明<a name="section2_PWM_des"></a>

**表2**  PWM设备API接口功能介绍

<a name="table2_PWM_des"></a>

<table border="0" cellpadding="0" cellspacing="0" width="800" style="border-collapse:
 collapse;table-layout:fixed;width:700pt">
 <colgroup><col class="xl65" width="300" style="mso-width-source:userset;mso-width-alt:13728;
 width:300pt">
 <col width="250" style="mso-width-source:userset;mso-width-alt:13216;width:250pt">
 <col width="300" style="mso-width-source:userset;mso-width-alt:28352;width:300pt">
 </colgroup><tbody><tr height="19" style="height:14.25pt">
  <td height="19" class="xl66" width="300" style="height:14.25pt;width:300pt">功能分类</td>
  <td class="xl67" width="250" style="width:250pt">接口名</td>
  <td class="xl67" width="300" style="width:300pt">描述</td>
 </tr>
 <tr height="19" style="height:14.25pt">
  <td rowspan="2" height="38" class="xl65" style="height:28.5pt">PWM句柄操作</td>
  <td>PwmOpen</td>
  <td>获取PWM设备驱动句柄</td>
 </tr>
 <tr height="19" style="height:14.25pt">
  <td height="19" style="height:14.25pt">PwmClose</td>
  <td>释放PWM设备驱动句柄</td>
 </tr>
 <tr height="19" style="height:14.25pt">
  <td rowspan="2" height="38" class="xl65" style="height:28.5pt">使能/禁用PWM</td>
  <td>PwmEnable</td>
  <td>使能PWM</td>
 </tr>
 <tr height="19" style="height:14.25pt">
  <td height="19" style="height:14.25pt">PwmDisable</td>
  <td>禁用PWM</td>
 </tr>
 <tr height="19" style="height:14.25pt">
  <td rowspan="3" height="57" class="xl65" style="height:42.75pt">PWM配置操作</td>
  <td>PwmSetPeriod</td>
  <td>设置PWM周期</td>
 </tr>
 <tr height="19" style="height:14.25pt">
  <td height="19" style="height:14.25pt">PwmSetDuty</td>
  <td>设置PWM占空时间</td>
 </tr>
 <tr height="19" style="height:14.25pt">
  <td height="19" style="height:14.25pt">PwmSetPolarity</td>
  <td>设置PWM极性</td>
 </tr>
 <tr height="19" style="height:14.25pt">
  <td rowspan="2" height="38" class="xl65" style="height:28.5pt">设置/获取PWM配置信息</td>
  <td>PwmSetConfig</td>
  <td>设置PWM设备参数</td>
 </tr>
 <tr height="19" style="height:14.25pt">
  <td height="19" style="height:14.25pt">PwmGetConfig</td>
  <td>获取PWM设备参数</td>
 </tr>
 <!--[if supportMisalignedColumns]-->
 <tr height="0" style="display:none">
  <td width="429" style="width:322pt"></td>
  <td width="413" style="width:310pt"></td>
  <td width="886" style="width:665pt"></td>
 </tr>
 <!--[endif]-->
</tbody></table>



>![](W:\doc\docs\zh-cn\device-dev\public_sys-resources\icon-note.gif) **说明:** 
>PWM当前仅限内核态使用,不支持在用户态使用。

## 使用指导<a name="section3_PWM_des"></a>

### 使用流程<a name="section3.1_PWM_des"></a>

在操作系统启动过程中,驱动管理模块根据配置文件加载PWM驱动,PWM驱动会检测PWM器件并初始化驱动。

使用PWM设备的一般流程如[图1](#fig1_PWM_des)所示。

**图 1**  PWM设备使用流程图<a name="fig1_PWM_des"></a>  


![](figures/PWM设备使用流程图.png)

### 获取PWM设备句柄<a name="section3.2_PWM_des"></a>
D
duangavin123 已提交
129 130 131

在操作PWM设备时,首先要调用PwmOpen获取PWM设备句柄,该函数会返回指定设备号的PWM设备句柄。

Y
yinshuqing 已提交
132 133
```c
DevHandle PwmOpen(uint32_t num);
D
duangavin123 已提交
134
```
Y
yinshuqing 已提交
135 136 137 138 139 140 141 142 143 144 145 146 147 148

**表3**  PwmOpen参数和返回值描述

<a name="table3_PWM_des"></a>

| 参数       | 参数描述                |
| ---------- | ----------------------- |
| num        | PWM设备编号             |
| **返回值** | **返回值描述**          |
| handle     | 获取成功返回PWM设备句柄 |
| NULL       | 获取失败                |


```c
D
duangavin123 已提交
149
uint32_t num = 0;             /* PWM设备号 */
Y
yinshuqing 已提交
150
DevHandle handle = NULL;
D
duangavin123 已提交
151 152

/* 获取PWM设备句柄 */
Y
yinshuqing 已提交
153 154 155
handle = PwmOpen(num);
if (handle  == NULL) {
    /* 错误处理 */
D
duangavin123 已提交
156 157 158
}
```

Y
yinshuqing 已提交
159 160 161
### 销毁PWM设备句柄<a name="section3.3_PWM_des"></a>

关闭PWM设备,系统释放对应的资源。
D
duangavin123 已提交
162

Y
yinshuqing 已提交
163 164
```c
void PwmClose(DevHandle handle);
D
duangavin123 已提交
165
```
Y
yinshuqing 已提交
166 167 168 169 170 171 172 173 174 175 176 177 178

**表4**  PwmClose参数描述

<a name="table4_PWM_des"></a>

| 参数   | 参数描述    |
| ------ | ----------- |
| handle | PWM设备句柄 |


```c
/* 销毁PWM设备句柄 */
PwmClose(handle);
D
duangavin123 已提交
179 180
```

Y
yinshuqing 已提交
181 182 183
### 使能<a name="section3.4_PWM_des"></a>

启用PWM设备。
D
duangavin123 已提交
184

Y
yinshuqing 已提交
185 186
```c
int32_t PwmEnable(DevHandle handle);
D
duangavin123 已提交
187
```
Y
yinshuqing 已提交
188 189 190 191 192 193 194 195 196 197 198 199 200

**表5** PwmEnable参数描述

<a name="table5_PWM_des"></a>

| 参数       | 参数描述       |
| ---------- | -------------- |
| handle     | PWM设备句柄    |
| **返回值** | **返回值描述** |
| 0          | 使能成功       |
| 负数       | 使能失败       |

```c
D
duangavin123 已提交
201
int32_t ret;
Y
yinshuqing 已提交
202 203 204

/*启用PWM设备*/
ret = PwmEnable(handle);
D
duangavin123 已提交
205
if (ret != 0) {
Y
yinshuqing 已提交
206
	/*错误处理*/
D
duangavin123 已提交
207 208 209
}
```

Y
yinshuqing 已提交
210
### 禁用<a name="section3.5_PWM_des"></a>
D
duangavin123 已提交
211

Y
yinshuqing 已提交
212 213 214 215
禁用PWM设备。

```c
int32_t PwmDisable(DevHandle handle);
D
duangavin123 已提交
216
```
Y
yinshuqing 已提交
217 218 219 220 221 222 223 224 225 226 227 228 229

**表6** PwmDisable参数描述

<a name="table6_PWM_des"></a>

| 参数       | 参数描述       |
| ---------- | -------------- |
| handle     | PWM设备句柄    |
| **返回值** | **返回值描述** |
| 0          | 禁用成功       |
| 负数       | 禁用失败       |

```c
D
duangavin123 已提交
230
int32_t ret;
Y
yinshuqing 已提交
231 232 233

/*禁用PWM设备*/
ret = PwmDisable(handle);
D
duangavin123 已提交
234
if (ret != 0) {
Y
yinshuqing 已提交
235
	/*错误处理*/
D
duangavin123 已提交
236 237 238
}
```

Y
yinshuqing 已提交
239
### 设置PWM设备周期<a name="section3.6_PWM_des"></a>
D
duangavin123 已提交
240

Y
yinshuqing 已提交
241 242 243 244
设置PWM设备周期。

```c
int32_t PwmSetPeriod(DevHandle handle, uint32_t period);
D
duangavin123 已提交
245
```
Y
yinshuqing 已提交
246 247 248 249 250 251 252 253 254 255 256 257 258 259

**表7** PwmSetPeriod参数描述

<a name="table7_PWM_des"></a>

| 参数       | 参数描述                 |
| ---------- | ------------------------ |
| handle     | PWM设备句柄              |
| period     | 要设置的周期,单位为纳秒 |
| **返回值** | **返回值描述**           |
| 0          | 设置成功                 |
| 负数       | 设置失败                 |

```c
D
duangavin123 已提交
260
int32_t ret;
Y
yinshuqing 已提交
261 262 263

/*设置周期为50000000纳秒*/
ret = PwmSetPeriod(handle, 50000000);
D
duangavin123 已提交
264
if (ret != 0) {
Y
yinshuqing 已提交
265
	/*错误处理*/
D
duangavin123 已提交
266 267
}
```
Y
yinshuqing 已提交
268
### 设置PWM设备占空时间<a name="section3.7_PWM_des"></a>
D
duangavin123 已提交
269

Y
yinshuqing 已提交
270
设置PWM设备占空时间。
D
duangavin123 已提交
271

Y
yinshuqing 已提交
272 273
```c
int32_t PwmSetDuty(DevHandle handle, uint32_t duty);
D
duangavin123 已提交
274
```
Y
yinshuqing 已提交
275 276 277 278 279 280 281 282 283 284 285 286 287 288

**表8** PwmSetDuty参数描述

<a name="table8_PWM_des"></a>

| 参数       | 参数描述                     |
| ---------- | ---------------------------- |
| handle     | PWM设备句柄                  |
| duty       | 要设置的占空时间,单位为纳秒 |
| **返回值** | **返回值描述**               |
| 0          | 设置成功                     |
| 负数       | 设置失败                     |

```c
D
duangavin123 已提交
289
int32_t ret;
Y
yinshuqing 已提交
290 291 292

/*设置占空时间为25000000纳秒*/
ret = PwmSetDuty(handle, 25000000);
D
duangavin123 已提交
293
if (ret != 0) {
Y
yinshuqing 已提交
294
	/*错误处理*/
D
duangavin123 已提交
295 296
}
```
Y
yinshuqing 已提交
297
### 设置PWM设备极性<a name="section3.8_PWM_des"></a>
D
duangavin123 已提交
298

Y
yinshuqing 已提交
299
设置PWM设备极性。
D
duangavin123 已提交
300

Y
yinshuqing 已提交
301 302
```c
int32_t PwmSetPolarity(DevHandle handle, uint8_t polarity);
D
duangavin123 已提交
303
```
Y
yinshuqing 已提交
304 305 306 307 308 309 310 311 312 313 314 315 316 317

**表9** PwmSetPolarity参数描述

<a name="table9_PWM_des"></a>

| 参数       | 参数描述            |
| ---------- | ------------------- |
| handle     | PWM设备句柄         |
| polarity   | 要设置的极性,正/反 |
| **返回值** | **返回值描述**      |
| 0          | 设置成功            |
| 负数       | 设置失败            |

```c
D
duangavin123 已提交
318
int32_t ret;
Y
yinshuqing 已提交
319 320 321

/*设置极性为反*/
ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY);
D
duangavin123 已提交
322
if (ret != 0) {
Y
yinshuqing 已提交
323
	/*错误处理*/
D
duangavin123 已提交
324 325 326 327
}
```


Y
yinshuqing 已提交
328 329 330 331 332 333
### 设置PWM设备参数<a name="section3.9_PWM_des"></a>

设置PWM设备参数。

```c
int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config);
D
duangavin123 已提交
334
```
Y
yinshuqing 已提交
335 336 337 338 339 340 341 342 343 344 345 346 347 348

**表10** PwmSetConfig参数描述

<a name="table10_PWM_des"></a>

| 参数       | 参数描述       |
| ---------- | -------------- |
| handle     | PWM设备句柄    |
| *config    | 参数指针       |
| **返回值** | **返回值描述** |
| 0          | 设置成功       |
| 负数       | 设置失败       |

```c
D
duangavin123 已提交
349
int32_t ret;
Y
yinshuqing 已提交
350 351 352 353 354 355 356 357 358
struct PwmConfig pcfg;
pcfg.duty = 25000000;					/*占空时间为25000000纳秒*/                  
pcfg.period = 50000000;					/*周期为50000000纳秒*/
pcfg.number = 0;						/*不断产生方波*/
pcfg.polarity = PWM_INVERTED_POLARITY;	/*极性为反*/
pcfg.status = PWM_ENABLE_STATUS;		/*运行状态为启用*/

/*设置PWM设备参数*/
ret = PwmSetConfig(handle, &pcfg);
D
duangavin123 已提交
359
if (ret != 0) {
Y
yinshuqing 已提交
360
	/*错误处理*/
D
duangavin123 已提交
361 362 363
}
```

Y
yinshuqing 已提交
364
### 获取PWM设备参数<a name="section3.10_PWM_des"></a>
D
duangavin123 已提交
365

Y
yinshuqing 已提交
366
获取PWM设备参数。
D
duangavin123 已提交
367

Y
yinshuqing 已提交
368 369 370
```c
int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config);
```
D
duangavin123 已提交
371

Y
yinshuqing 已提交
372
**表11** PwmGetConfig参数描述
D
duangavin123 已提交
373

Y
yinshuqing 已提交
374
<a name="table11_PWM_des"></a>
D
duangavin123 已提交
375

Y
yinshuqing 已提交
376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392
| 参数       | 参数描述       |
| ---------- | -------------- |
| handle     | PWM设备句柄    |
| *config    | 参数指针       |
| **返回值** | **返回值描述** |
| 0          | 获取成功       |
| 负数       | 获取失败       |

```c
int32_t ret;
struct PwmConfig pcfg;

/*获取PWM设备参数*/
ret = PwmGetConfig(handle, &pcfg);
if (ret != 0) {
	/*错误处理*/
}
D
duangavin123 已提交
393 394
```

Y
yinshuqing 已提交
395
## 使用实例<a name="section4_PWM_des"></a>
D
duangavin123 已提交
396

Y
yinshuqing 已提交
397
PWM设备完整的使用示例如下所示,首先获取PWM设备句柄,然后设置设备周期、占空时间、极性,获取设备参数。使能,设置设备参数,禁用,最后销毁PWM设备句柄。
D
duangavin123 已提交
398 399 400 401 402

```
void PwmTestSample(void)
{
    int32_t ret;
Y
yinshuqing 已提交
403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419
    uint32_t num;
    DevHandle handle = NULL;

    struct PwmConfig pcfg;
    pcfg.duty = 20000000;					/*占空时间为20000000纳秒*/                  
    pcfg.period = 40000000;					/*周期为40000000纳秒*/
    pcfg.number = 100;						/*生成100个方波*/
    pcfg.polarity = PWM_NORMAL_POLARITY;	/*极性为正*/
    pcfg.status = PWM_ENABLE_STATUS;		/*运行状态为启用*/
    
    /* PWM设备编号,要填写实际平台上的编号 */
    num = 1; 

    /* 获取PWM设备句柄 */
    handle = PwmOpen(num);
    if (handle == NULL) {
        HDF_LOGE("PwmOpen: failed!\n");
D
duangavin123 已提交
420 421
        return;
    }
Y
yinshuqing 已提交
422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445

    /*设置周期为50000000纳秒*/
    ret = PwmSetPeriod(handle, 50000000);
    if (ret != 0) {
        HDF_LOGE("PwmSetPeriod: failed, ret %d\n", ret);
        goto _ERR;
    }

    /*设置占空时间为25000000纳秒*/
    ret = PwmSetDuty(handle, 25000000);
    if (ret != 0) {
        HDF_LOGE("PwmSetDuty: failed, ret %d\n", ret);
        goto _ERR;
    }

    /*设置极性为反*/
    ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY);
    if (ret != 0) {
        HDF_LOGE("PwmSetPolarity: failed, ret %d\n", ret);
        goto _ERR;
    }
    
    /*获取PWM设备参数*/
    ret = PwmGetConfig(handle, &pcfg);
D
duangavin123 已提交
446 447
    if (ret != 0) {
        HDF_LOGE("PwmGetConfig: failed, ret %d\n", ret);
Y
yinshuqing 已提交
448
        goto _ERR;
D
duangavin123 已提交
449
    }
Y
yinshuqing 已提交
450 451 452
    
    /*启用PWM设备*/
    ret = PwmEnable(handle);
D
duangavin123 已提交
453
    if (ret != 0) {
Y
yinshuqing 已提交
454 455
	    HDF_LOGE("PwmEnable: failed, ret %d\n", ret);
        goto _ERR;
D
duangavin123 已提交
456
    }
Y
yinshuqing 已提交
457 458 459

    /*设置PWM设备参数*/
    ret = PwmSetConfig(handle, &pcfg);
D
duangavin123 已提交
460
    if (ret != 0) {
Y
yinshuqing 已提交
461 462
        HDF_LOGE("PwmSetConfig: failed, ret %d\n", ret);
        goto _ERR;
D
duangavin123 已提交
463
    }
Y
yinshuqing 已提交
464 465 466

    /*禁用PWM设备*/
    ret = PwmDisable(handle);
D
duangavin123 已提交
467 468
    if (ret != 0) {
        HDF_LOGE("PwmDisable: failed, ret %d\n", ret);
Y
yinshuqing 已提交
469
        goto _ERR;
D
duangavin123 已提交
470
    }
Y
yinshuqing 已提交
471 472 473 474
    
_ERR:
    /* 销毁PWM设备句柄 */
    PwmClose(handle); 
D
duangavin123 已提交
475 476
}
```