osd-contiki/platform/osd-merkur/dev/t4-servo.h

97 lines
3.2 KiB
C
Raw Normal View History

2013-04-09 13:56:04 +02:00
/*
** Copyright (C) 2013 Marcus Priesch, All rights reserved
** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at
**
** Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions
** are met:
** 1. Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** 2. Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in the
** documentation and/or other materials provided with the distribution.
** 3. Neither the name of the Institute nor the names of its contributors
** may be used to endorse or promote products derived from this software
** without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
** ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
** SUCH DAMAGE.
**
**++
** Name
** t4-servo
**
** Purpose
** Implements software pwm on any portpins via timer 4
**
**
** Revision Dates
** 31-Mar-2013 (MPR) Creation
** <EFBFBD><EFBFBD>revision-date<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**--
*/
#ifndef __T4_SERVO_H__
#define __T4_SERVO_H__
// timing: (X:pwm, _:zero)
//
// X_______________XXXXXXXXXXXXX_______________XXXXXXXXXXXXX
//
// |<------------->|<--------->|<------------->|<--------->| ...
// SERVO_OFFSET SERVO_MAX SERVO_OFFSET SERVO_MAX
//
// within SERVO_MAX you get the PWM set with servo_set (id, pwm)
// if you set SERVO_OFFSET to zero, you get a pwm from 0 to 100% duty cycle
//
// the period of the smallest tick is derived from the timer4 prescaler
// plus the ISR overhead. however, the latter one should be constant
// regardless of the pwm signal generated
#define SERVO_OFFSET 256
#define SERVO_MIN 16
#define SERVO_MAX 32
// Counter value for timer 4 without any prescaler for a single tick
#define PWMFREQ 500
#define T4_VALUE F_CPU/SERVO_MAX/PWMFREQ
#define SERVO_COUNT 4
#define DEFAULT_PORT 0x0E
#define DEFAULT_PIN 1
#define DEFAULT_DDR 0x0D
typedef struct struct_servo_channel
{
unsigned char port;
unsigned char pin;
unsigned char ddr;
unsigned char duty;
} servo_channel_type;
void t4_servo_init(void);
void t4_servo_off(void);
int t4_servo_get(unsigned int channel);
int t4_servo_set(unsigned int channel, unsigned int duty);
int t4_servo_set_io
( unsigned char channel
, unsigned char port
, unsigned char ddr
, unsigned char pin
);
#endif /* __T4_SERVO_H__ */