Quellcode von STM32F4-Discovery |
|
Download:
vollständiger Ausschnitt aus main.c
/* File: main.c
* Date: 13.05.2013
* Author: Jan Kurzawski
* Description: Programm für ADC-Wandlung mit
I2C-Schnittstelle.
*
Wert aus dem Infrarot-Sensor (GP2Y0A710K0F) über I2C-Bus als Ausgangsspannung
zur Variable "voltage" zugewiesen. (siehe auch Datenblatt)
*/
#include "i2c.h"
#include <stm32f4xx_tim.h>
// I2C Slave-Adresse =
01001000
#define
DEVICE_ADDRESS ((uint8_t)0x48)
// Initialisierung vom Timer
TIM6
// Update Event
(Hz) = Timer_Clock / [(TIMx_PSC+1)*(TIMx_ARR+1)]
void TIM6_Init(void)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; // APB1 als
Clock für den Timer aktivieren (Internal timer clock = 84 MHz)
TIM6->PSC = 0; // Frequenz von der CLock übernehmen
TIM6->ARR = 83999; // Autoreload auf 83999 setzen
--> 1 reload = 1ms (bei 84MHz)
TIM6->CR1 |= TIM_CR1_OPM; // One pulse mode
TIM6->EGR |= TIM_EGR_UG; // Update erzwingen
TIM6->SR &= ~TIM_SR_UIF; // Update flag löschen
}
/**********************************************************************************/
// Funktion zum Warten
(Wertangabe 1ms)
void
myDelay (__IO uint16_t nTime)
{
for(nTime; nTime>0; nTime--)
{
TIM6->CR1 |= TIM_CR1_CEN;
// TIM6 counter aktivieren
while(TIM6->CR1 & TIM_CR1_CEN){}
}
}
/**********************************************************************************/
// Funktion zum Ausrechnen
von Dezimalwerten
//
Aus 2 8-Bit-Werten wird der gemessene Wert bestimmt
uint16_t calcValue (uint8_t* rawVal)
{
uint16_t result;
*(((uint8_t*)(&result)) + 0)
= rawVal[1];
*(((uint8_t*)(&result)) + 1) = rawVal[0];
return result;
}
//
Messwerte umrechnen und in 1 Array speichern
uint16_t arrPrepData[3];
volatile uint32_t test;
int
main(void)
{
// Variable zum Speichern des Sensorwertes
uint16_t sensor_value;
uint32_t voltage;
I2CBus_Init();
TIM6_Init();
/* ADS1000 auf
continuous-read mode setzen (Cfg-Byte) */
/***************************************************************************************/
// I2C1 aktivieren, ADC ansprechen und festlegen,
dass der Master Daten übertragen wird
I2C_start(I2C1, DEVICE_ADDRESS,
I2C_Direction_Transmitter);
// Konfigurationsbyte des ADC schreiben
I2C_write(I2C1, (uint8_t)0x80);
// I2C1 anhalten und den Bus freigeben
I2C_stop(I2C1);
while(1)
{
uint8_t
sensor_value_byte[2];
/* Werte aus dem ADC lesen - dazu müssen in Folge
zwei Register gelesen werden, welche die
Low- und High-Bytes des 16bt */
// I2C1 aktivieren, ADC ansprechen und festlegen,
dass der Master auf Daten wartet
I2C_start(I2C1, DEVICE_ADDRESS,
I2C_Direction_Receiver);
// Das 1. Byte vom ADC empfangen und mit ACK
bestätigen
sensor_value_byte[0] = I2C_read_ack(I2C1);
// Das 2. Byte(das letzte) vom ADC empfangen und mit
ACK bestätigen
sensor_value_byte[1] = I2C_read_ack(I2C1);
// I2C anhalten und den Bus freigeben
I2C_stop(I2C1);
/***************************************************************************************/
/* Sensorwert zu einem
großen int zusammenrechnen */
sensor_value = calcValue(sensor_value_byte);
voltage = sensor_value *
5000 / 2048; /* Ausgangsspannung */
test = voltage * 2;
/* 100 ms warten, bis der
nächste Wert ausgelesen wird */
myDelay(100);
}
}