查看: 3711|回复: 0

在pcduino上用多线程的方式模拟pwm

[复制链接]

该用户从未签到

发表于 2014-3-7 10:47:33 | 显示全部楼层 |阅读模式
分享到:
本帖最后由 cady 于 2014-3-7 10:49 编辑

脉冲宽度调制(PWM)是一种模拟控制方式,其根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。
PWM控制技术以其控制简单,灵活和动态响应好的优点而成为电力电子技术最广泛应用的控制方式,也是人们研究的热点。由于当今科学技术的发展已经没有了学科之间的界限,结合现代控制理论思想或实现无谐振波开关技术将会成为PWM控制技术发展的主要方向之一。

01.jpg


pcDuino上的GPIO都可以用软件来模拟输出PWM信号,这里我给大家展示一种以多线程的方式用GPIO来模拟输出PWM信号的例子。理论上有多少个GPIO就可以输出多少路pwm,我们只需要为每一路创建一个线程就行了,只不过信号频率可能不能设得很高,而且系统负担重的时候抖动比较大,对那些精度要求高的场合就不适用了。

代码:
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
/******************************************
*                                          *
*                                          *
*                                          *
*                                          *
*******************************************/
#include<pthread.h>
#include"gpio.h"
#include"delay.h"
#include"typedef.h"
#define LED_PIN1
#define PWM_PIN0
#define SIGNAL_CYCLE 200//uS
pthread_t ntid_pwm0;
volatile unsigned char duty0;
voidGenerateOnePuls(intfd,bool High,float duty)
{
  inttimeLow;
  inttimeHigh;
  if(duty >=100)duty =100;
  timeHigh = (int)(duty/100*SIGNAL_CYCLE);
  timeLow = SIGNAL_CYCLE - timeHigh;
  if(!High)
  {
    timeHigh = timeLow;
    timeLow = SIGNAL_CYCLE - timeHigh;
  }
  SetGpio(fd,HIGH);
  delay_us(timeHigh);
  SetGpio(fd,LOW);
  delay_us(timeLow);
}
void* Pwm0_thread_fun(void* arg)  
{
  intfd_pin_pwm0;
  intfd_mode_pwm0;
  GpoiInitial(&fd_pin_pwm0,&fd_mode_pwm0,PWM_PIN,OUTPUT);
  SetGpio(fd_pin_pwm0,LOW);
  while(1)  
  {
    GenerateOnePuls(fd_pin_pwm0,TRUE,duty0);
  }
  return(void*)0;
}
intmain(intargc,char **argv)
{
  interr;
  BOOL led_on;
  intfd_pin_led;
  intfd_mode_led;
  duty0 =1;
  GpoiInitial(&fd_pin_led,&fd_mode_led,LED_PIN,OUTPUT);
  err = pthread_create(&ntid_pwm0, NULL, Pwm0_thread_fun, NULL);
  if(err !=0)  
  {
     printf("%s\n", strerror(err));
  }
  while(1)
  {
    delay_ms(100);
    duty0 +=1;
    if(duty0 >=100)duty0 =1;
    led_on = !led_on;
    SetGpio(fd_pin_led,led_on);
  }
  return1;
}
点击下载<span style="color: #ff0000;"><a href="http://cnlearn.linksprite.com/wp-content/uploads/2014/03/pwmTest.zip"><span style="color: #ff0000;">pwmTest</span></a></span>源码包



回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /5 下一条

手机版|小黑屋|与非网

GMT+8, 2024-12-21 19:15 , Processed in 0.113160 second(s), 16 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.