Cleaned up Beaglebone sensors/actuators/PWM code
[matches/MCTX3420.git] / BBB code / pwm.c
1 #include "pwm.h"
2
3 /* Initialize PWM : 
4 1/ mmap /dev/mem to have write access to system clock 
5 2/ enable system clock (0x0 = disabled, 0x02 = enabled)
6 3/ set correct pin MUX 
7
8 can modify pwm variables through virtual filesystem:
9 "/sys/class/pwm/ehrpwm.1:0/..."
10
11 pwm drivers reference:
12 http://processors.wiki.ti.com/index.php/AM335x_PWM_Driver%27s_Guide */
13
14 void pwm_init(void)
15 {
16     FILE *pwm_mux;
17     int i;
18     volatile uint32_t *epwmss1;
19     
20     int fd = open("/dev/mem", O_RDWR);
21     
22     if(fd < 0)
23         {
24         printf("Can't open /dev/mem\n");
25         exit(1);
26         }
27
28     epwmss1 = (volatile uint32_t *) mmap(NULL, LENGTH, PROT_READ|PROT_WRITE, MAP_SHARED, fd, START);
29     if(epwmss1 == NULL)
30         {
31         printf("Can't mmap\n");
32         exit(1);
33         }
34     else
35         {
36                 epwmss1[OFFSET_1 / sizeof(uint32_t)] = 0x2;
37                 }
38     close(fd);
39     
40     pwm_mux = fopen("/sys/kernel/debug/omap_mux/gpmc_a2", "w");
41     fprintf(pwm_mux, "6");                                                      // pwm is mux mode 6
42     fclose(pwm_mux);
43 }
44
45 //can change filepath of pwm module "/ehrpwm.%d:0/" by passing %d as argument
46 //depends how many pwm modules we have to run
47 //TODO:
48
49 void pwm_start(void)
50 {
51     FILE *pwm_run;
52     pwm_run = fopen("/sys/class/pwm/ehrpwm.1:0/run", "w");
53     fprintf(pwm_run, "1");
54     fclose(pwm_run);
55 }
56
57 void pwm_stop(void)
58 {
59     FILE *pwm_run;
60     
61     pwm_run = fopen("/sys/class/pwm/ehrpwm.1:0/run", "w");
62     fprintf(pwm_run, "0");
63     fclose(pwm_run);
64 }
65
66 //duty_percent is just a regular percentage (i.e. 50 = 50%)
67
68 void pwm_set_duty(int duty_percent)
69 {
70     FILE *pwm_duty;
71     
72     pwm_duty = fopen("/sys/class/pwm/ehrpwm.1:0/duty_percent", "w"); 
73     fprintf(pwm_duty, "%d", duty_percent);
74     fclose(pwm_duty);
75 }
76
77 //freq is just normal frequency (i.e. 100 = 100Hz)
78
79 void pwm_set_period(int freq)
80 {
81     FILE *pwm_period;
82     
83     pwm_period = fopen("/sys/class/pwm/ehrpwm.1:0/period_freq", "w");
84     fprintf(pwm_period, "%d", freq);
85     fclose(pwm_period);
86 }

UCC git Repository :: git.ucc.asn.au