Navigation |
---|
Home |
Electronics |
static void MX_TIM2_Init(void)
functie. Standaard staat deze
op een waarde van 65535: htim2.Init.Period = 65535;
. Je
kunt deze ook uitlezen door de waarde van het Auto Reload Register (ARR) op te vragen: uint32_t period = TIM2->ARR;
. Als je deze waarde weet, kan je
een PWM signaal versturen door de waarde van het Capture / Compare Register aan te passen: TIM2->CCR1 = TIM2->ARR * ((float) speed_percentage) / 100.0;
.
Op het ontwikkelbord heb ik gekozen voor het gebruik van de SPI2 peripheral. Op de NUCLEO F446RE worden pins PC1 en PC2 voor MOSI en MISO respectievelijk gebruikt. Pin PB10 wordt voor SCK gebruikt.
Volgens de HAL beschrijving kun je met HAL_SPI_Transmit()
data via SPI versturen en met HAL_SPI_Receive
data via SPI ontvangen. Als je eerst wil
versturen en daarna gelijk wilt ontvangen kun je de functie HAL_SPI_TransmitReceive
gebruiken.
HAL_I2C_Mem_Read
te gebruiken. Er kan data naar een bepaald
geheugenadres op het I²C apparaat geschreven worden door HAL_I²C_Mem_Write
te gebruiken.
Omdat het uit te voeren project om een proof of concept gaat, zal worden gekozen voor een Windows programma, omdat hiermee het testen en demonstreren van functies het makkelijkst gaat.
De magnetische encoders gebruiken een Clock polarity van 0 en een Clock phase op de tweede edge
(CPOL = 0, CPHA = 1). Ook gebruiken ze MSB first. Er wordt nog geen CRC berekening bijgehouden
voor de communicatie met de magnetische encoder. Om de peripheral aan te zetten moet nog hspi2.Instance->CR1 |= (1 << 6);
gebruikt worden nadat
de hspi2.Init
struct is ingesteld in de static void MX_SPI2_Init(void)
functie. Hiermee wordt de
SPE bit op 1 gezet. Het control
register voor de SPI peripheral
(CR1) kan dus als volgt ingesteld worden:
BIDIMODE | BIDIOE | CRCEN | CRCNEXT | DFF | RXONLY | SSM | SSI | LSBFIRST | SPE | BR2 | BR1 | BR0 | MSTR | CPOL | CPHA |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 |
In het control register 2 (CR2) van de SPI peripheral kunnen alle bits op 0 gelaten worden
behalve de
Slave Select Output Enable. Deze kan ook op 1 gezet worden als dat nodig is. (Dit hoeft niet als
de slaves SS pins met GPIO pins aangestuurd worden). Dit wordt gedaan
met hspi2.Instance->CR2 |= SPI_CR2_SSOE;
Om data te sturen via SPI heb ik een functie gemaakt die eerste de data in het data register van de peripheral zet, en waarna wordt gekeken of de transmit buffer wel leeg is of niet.
/**
* @brief send something with SPI
* @param data the data to send
*/
void SPI_send(uint8_t data)
{
// put the data in the data register
SPI2->DR = data;
// check if the transmit buffer is empty in the status register
while ((SPI2->SR & SPI_SR_TXE) != SPI_SR_TXE);
}
Het versturen van de data met SPI kan ook gebeuren via de HAL library met HAL_SPI_Transmit(&hspi2, &data, 8, HAL_MAX_DELAY);.
Een video van de app die laat zien dat de motoren kunnen draaien met gebruik van de app