BWP-SS19-01/Testkonzept/01/Ausführung: Unterschied zwischen den Versionen

Aus Verteilte Systeme - Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „= Einleitung = = Ausführung =“)
 
 
(4 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
  +
Auf einem Ubuntu 18.04.2 LTS wurde getestet, ob Zephyr inklusive der notwendigen Pakete installiert werden kann und ob der [https://www.adafruit.com/product/3406 Adafruit Feather] vom System erkannt wird.
= Einleitung =
 
  +
= Ausführung =
 
  +
  +
Dabei wurde der [https://docs.zephyrproject.org/latest/getting_started/index.html Getting Started Guide] zum Setup einer Zephyr-Umgebung befolgt, sowie die nötigen Pakete aus einem weiteren [https://docs.zephyrproject.org/latest/guides/tools/nordic_segger.html#nordic-segger Guide] installiert. Letztere werden für den Adafruit Feather benötigt.
  +
  +
Bei der Installation traten keine Probleme auf.
  +
  +
  +
Ein erster Versuch den Feather zu flashen führte zu einer Fehlermeldung:
  +
<kbd>ERROR: JLinkARM DLL not found. Please reinstall latest JLinkARM.</kbd>
  +
  +
Das ließ sich durch einen Link auf den JLink-Ordner, der per default in ''/opt/SEGGER/JLink'' liegt, lösen:
  +
ln -s /usr/lib/libjlinkarm_x86.so /opt/SEGGER/JLink
  +
  +
  +
  +
Der Feather wird vom System erkannt und lässt sich über ''minicom'' erreichen.
  +
  +
Zum jetzigen Zeitpunkt (Stand: 13.05.19) konnte der Feather noch nicht über die Zephyr-Toolchain geflasht werden, da hierfür zusätzliche Hardware benötigt wird.
  +
  +
  +
  +
Nach Eintreffen der Hardware in Form eines [https://www.segger.com/products/debug-probes/j-link/models/j-link-edu/ J-Link EDU] sowie eines [https://www.exp-tech.de/module/schnittstellen/6133/jtag-2x10-2.54mm-to-swd-2x5-1.27mm-cable-adapter-board Adapters] konnte der Feather erfolgreich geflasht werden.
  +
Unter Zephyr wird hierzu das Tool [https://docs.zephyrproject.org/latest/guides/west/index.html west] verwendet.
  +
  +
Eine Anwendung wird mit Angabe der Ziel-Hardware ("board") erstellt:
  +
<pre> west build -b nrf52_adafruit_feather </pre>
  +
Und schließlich geflasht:
  +
<pre> west flash </pre>
  +
  +
  +
  +
'''PWM Driver Buggy'''
  +
  +
Beim Testen der Anwendungen, die ein PWM Signal benötigen ist herausgekommen das der PWM-Treiber für Zephyr auf dem nrf52 nicht ordnungsgemäß funktioniert. Es konnte eine Alternative gefunden werden. Dafür ist folgender Code von [https://lists.zephyrproject.org/g/users/topic/zephyr_devel_buggy_pwm/16761453?p=,,,20,0,0,0::recentpostdate%2Fsticky,,,20,2,60,16761453 DIESER] Webside nötig:
  +
  +
<pre>
  +
  +
/* pwm output pin */
  +
#define PWM_OUT_PIN (0 | 31)
  +
  +
/* pwm frequency and clk in Hz */
  +
#define PWM_FREQUENCY 1000
  +
#define PWM_CLK 8000000
  +
#define PWM_TOP_VALUE_FIX (PWM_CLK / PWM_FREQUENCY)
  +
#define PWM_MAX_DUTY 0.30f /* 30 % */
  +
#define PWM_MIN_DUTY 0.05 /* 5% */
  +
#define PWM_PERCENT_RESOLUTION 0.0125 /* % */
  +
  +
/* polarity to be added on pwm sequencer */
  +
#define PWM_POLARITY_OFFSET (1 << 15)
  +
  +
/** private variables */
  +
static uint16_t nrf_pwm_sequence[4] = {4096 + PWM_POLARITY_OFFSET , 0 + PWM_POLARITY_OFFSET, 0 + PWM_POLARITY_OFFSET, 0 + PWM_POLARITY_OFFSET};
  +
  +
/**
  +
* temp_pwm_init()
  +
*
  +
* @brief inits the pwm controller and route it to the heater
  +
* @param
  +
* @return
  +
*/
  +
static void temp_pwm_init(void)
  +
{
  +
NRF_PWM0->PSEL.OUT[0] = PWM_OUT_PIN;
  +
  +
/* pwm in upmode */
  +
NRF_PWM0->MODE = 0;
  +
  +
/* sets pwm count top to be at 1 KHz and decode pwm in common mode*/
  +
NRF_PWM0->COUNTERTOP = PWM_CLK / PWM_FREQUENCY;
  +
NRF_PWM0->DECODER = 0x00000002;
  +
NRF_PWM0->LOOP = 0;
  +
NRF_PWM0->SEQ[0].REFRESH = 0;
  +
NRF_PWM0->SEQ[0].ENDDELAY = 0;
  +
  +
/* select clock source prescaler */
  +
NRF_PWM0->PRESCALER = 0x00000001;
  +
  +
/* enables the PWM */
  +
NRF_PWM0->SEQ[0].PTR = ((uint32_t)nrf_pwm_sequence);
  +
NRF_PWM0->SEQ[0].CNT = sizeof(nrf_pwm_sequence) / sizeof(uint16_t);
  +
NRF_PWM0->ENABLE = 1;
  +
  +
/* trigger it! */
  +
NRF_PWM0->TASKS_SEQSTART[0] = 1;
  +
}
  +
  +
/**
  +
* temp_pwm_set_val()
  +
*
  +
* @brief set the pwm with a new duty cicle
  +
* @param
  +
* @return
  +
*/
  +
static void temp_pwm_set_val(float required_energy)
  +
{
  +
  +
#ifndef TEMP_CLOSED_LOOP
  +
/* saturate the energy expected */
  +
if(required_energy < TEMP_MAINTENANCE_ENERGY)
  +
required_energy = TEMP_MAINTENANCE_ENERGY;
  +
  +
if(required_energy > TEMP_MAXIMUM_ENERGY_AVAILABLE)
  +
required_energy = TEMP_MAXIMUM_ENERGY_AVAILABLE;
  +
  +
#else
  +
/* saturate the energy required to the bound values, note in closed loop
  +
* we can increase the pwm output to the maximum during a cycle
  +
*/
  +
if(required_energy < TEMP_MAINTENANCE_ENERGY)
  +
required_energy = TEMP_MAINTENANCE_ENERGY;
  +
  +
if(required_energy > TEMP_MAXIMUM_ENERGY_EXCURTION)
  +
required_energy = TEMP_MAXIMUM_ENERGY_EXCURTION;
  +
  +
#endif
  +
  +
/* obtains the duty cicle and sums it up with polarity offset */
  +
uint16_t duty = (uint16_t)((required_energy / TEMP_MAXIMUM_ENERGY_EXCURTION) * (float)PWM_TOP_VALUE_FIX);
  +
duty |= PWM_POLARITY_OFFSET;
  +
  +
  +
/* update the duty cicle */
  +
nrf_pwm_sequence[0] = duty;
  +
nrf_pwm_sequence[1] = duty;
  +
nrf_pwm_sequence[2] = duty;
  +
nrf_pwm_sequence[3] = duty;
  +
  +
NRF_PWM0->TASKS_SEQSTART[0] = 1;
  +
}
  +
  +
</pre>

Aktuelle Version vom 24. August 2019, 15:22 Uhr

Auf einem Ubuntu 18.04.2 LTS wurde getestet, ob Zephyr inklusive der notwendigen Pakete installiert werden kann und ob der Adafruit Feather vom System erkannt wird.


Dabei wurde der Getting Started Guide zum Setup einer Zephyr-Umgebung befolgt, sowie die nötigen Pakete aus einem weiteren Guide installiert. Letztere werden für den Adafruit Feather benötigt.

Bei der Installation traten keine Probleme auf.


Ein erster Versuch den Feather zu flashen führte zu einer Fehlermeldung:

ERROR: JLinkARM DLL not found. Please reinstall latest JLinkARM.

Das ließ sich durch einen Link auf den JLink-Ordner, der per default in /opt/SEGGER/JLink liegt, lösen:

ln -s /usr/lib/libjlinkarm_x86.so /opt/SEGGER/JLink


Der Feather wird vom System erkannt und lässt sich über minicom erreichen.

Zum jetzigen Zeitpunkt (Stand: 13.05.19) konnte der Feather noch nicht über die Zephyr-Toolchain geflasht werden, da hierfür zusätzliche Hardware benötigt wird.


Nach Eintreffen der Hardware in Form eines J-Link EDU sowie eines Adapters konnte der Feather erfolgreich geflasht werden. Unter Zephyr wird hierzu das Tool west verwendet.

Eine Anwendung wird mit Angabe der Ziel-Hardware ("board") erstellt:

 west build -b nrf52_adafruit_feather 

Und schließlich geflasht:

 west flash 


PWM Driver Buggy

Beim Testen der Anwendungen, die ein PWM Signal benötigen ist herausgekommen das der PWM-Treiber für Zephyr auf dem nrf52 nicht ordnungsgemäß funktioniert. Es konnte eine Alternative gefunden werden. Dafür ist folgender Code von DIESER Webside nötig:


/* pwm output pin */
#define PWM_OUT_PIN		(0 | 31)

/* pwm frequency and clk in Hz */
#define PWM_FREQUENCY			1000
#define PWM_CLK					8000000
#define PWM_TOP_VALUE_FIX		(PWM_CLK / PWM_FREQUENCY)
#define PWM_MAX_DUTY			0.30f /* 30 % */
#define PWM_MIN_DUTY			0.05   /* 5% */
#define PWM_PERCENT_RESOLUTION	0.0125 /* % */

/* polarity to be added on pwm sequencer */
#define PWM_POLARITY_OFFSET		(1 << 15)

/** private variables */
static uint16_t nrf_pwm_sequence[4] = {4096 + PWM_POLARITY_OFFSET , 0 + PWM_POLARITY_OFFSET, 0 + PWM_POLARITY_OFFSET, 0 + PWM_POLARITY_OFFSET};

/**
 * temp_pwm_init()
 *
 * @brief inits the pwm controller and route it to the heater
 * @param
 * @return
 */
static void temp_pwm_init(void)
{
	NRF_PWM0->PSEL.OUT[0] = PWM_OUT_PIN;

	/* pwm in upmode */
	NRF_PWM0->MODE = 0;

	/* sets pwm count top to be at 1 KHz  and decode pwm in common mode*/
	NRF_PWM0->COUNTERTOP = PWM_CLK / PWM_FREQUENCY;
	NRF_PWM0->DECODER =  0x00000002;
	NRF_PWM0->LOOP = 0;
	NRF_PWM0->SEQ[0].REFRESH = 0;
	NRF_PWM0->SEQ[0].ENDDELAY = 0;

	/* select clock source prescaler */
	NRF_PWM0->PRESCALER = 0x00000001;

	/* enables the PWM */
	NRF_PWM0->SEQ[0].PTR  = ((uint32_t)nrf_pwm_sequence);
	NRF_PWM0->SEQ[0].CNT  = sizeof(nrf_pwm_sequence) / sizeof(uint16_t);
	NRF_PWM0->ENABLE = 1;

	/* trigger it! */
	NRF_PWM0->TASKS_SEQSTART[0] = 1;
}

/**
 * temp_pwm_set_val()
 *
 * @brief set the pwm with a new duty cicle
 * @param
 * @return
 */
static void temp_pwm_set_val(float required_energy)
{

#ifndef TEMP_CLOSED_LOOP
	/* saturate the energy expected */
	if(required_energy < TEMP_MAINTENANCE_ENERGY)
		required_energy = TEMP_MAINTENANCE_ENERGY;

	if(required_energy > TEMP_MAXIMUM_ENERGY_AVAILABLE)
		required_energy = TEMP_MAXIMUM_ENERGY_AVAILABLE;

#else
	/* saturate the energy required to the bound values, note in closed loop
	 * we can increase the pwm output to the maximum during a cycle
	 */
	if(required_energy < TEMP_MAINTENANCE_ENERGY)
		required_energy = TEMP_MAINTENANCE_ENERGY;

	if(required_energy > TEMP_MAXIMUM_ENERGY_EXCURTION)
		required_energy = TEMP_MAXIMUM_ENERGY_EXCURTION;

#endif

	/* obtains the duty cicle  and sums it up with polarity offset */
	uint16_t duty = (uint16_t)((required_energy / TEMP_MAXIMUM_ENERGY_EXCURTION) * (float)PWM_TOP_VALUE_FIX);
	duty |= PWM_POLARITY_OFFSET;


	/* update the duty cicle */
	nrf_pwm_sequence[0] = duty;
	nrf_pwm_sequence[1] = duty;
	nrf_pwm_sequence[2] = duty;
	nrf_pwm_sequence[3] = duty;

	NRF_PWM0->TASKS_SEQSTART[0] = 1;
}