diff --git a/Makefile b/Makefile index 48fe8d4d57ffa34dd66d3d148e28543a926574cd..418bd7f51c320402c65399732d9439f87577caa0 100755 --- a/Makefile +++ b/Makefile @@ -16,6 +16,7 @@ TARGET_FILES+=src/adc_dma.c TARGET_FILES+=src/imu.c TARGET_FILES+=src/darwin_dyn_slave.c TARGET_FILES+=src/darwin_dyn_master.c +TARGET_FILES+=src/darwin_dyn_master_v2.c TARGET_FILES+=src/stm32f1xx_hal_msp.c TARGET_FILES+=src/motion_manager.c TARGET_FILES+=src/action.c @@ -87,6 +88,7 @@ TARGET_FILES+=$(HAL_PATH)/src/stm32f1xx_hal_spi.c TARGET_FILES+=$(HAL_PATH)/src/stm32f1xx_hal.c TARGET_FILES+=$(USART_PATH)/src/usart3.c +TARGET_FILES+=$(USART_PATH)/src/usart2.c TARGET_FILES+=$(USART_PATH)/src/usart1.c DARWIN_OBJS_TMP = $(notdir $(TARGET_FILES:.c=.o)) diff --git a/include/adc_dma.h b/include/adc_dma.h index 898830f6e720575277306d67d865f3c0afe0ddb9..0fd1dc41c7b437f8177404d968c381193d708393 100755 --- a/include/adc_dma.h +++ b/include/adc_dma.h @@ -7,10 +7,10 @@ extern "C" { #include "stm32f1xx.h" -#define ADC_NUM_CHANNELS 16 +#define ADC_NUM_CHANNELS 12 typedef enum {ADC_CH1=0,ADC_CH2=1,ADC_CH3=2,ADC_CH4=3,ADC_CH5=4,ADC_CH6=5,ADC_CH7=6,ADC_CH8=7, - ADC_CH9=8,ADC_CH10=9,ADC_CH11=10,ADC_CH12=11,ADC_CH13=12,ADC_CH14=13,ADC_CH16=15,ADC_CH18=17} adc_ch_t; + ADC_CH9=8,ADC_CH10=9,ADC_CH12=10,ADC_CH14=11} adc_ch_t; void adc_init(void); void adc_start(void); diff --git a/include/darwin_dyn_master_v2.h b/include/darwin_dyn_master_v2.h new file mode 100644 index 0000000000000000000000000000000000000000..b4a1b34d01c20f6e411ad3902e9d86682697c99c --- /dev/null +++ b/include/darwin_dyn_master_v2.h @@ -0,0 +1,21 @@ +#ifndef _DARWIN_DYN_MASTER_V2_H +#define _DARWIN_DYN_MASTER_V2_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stm32f1xx.h" +#include "comm.h" +#include "dynamixel_master.h" + +extern TDynamixelMaster darwin_dyn_master_v2; + +void darwin_dyn_master_v2_init(void); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/include/darwin_registers.h b/include/darwin_registers.h index ea4272ecb3e36fd1caaf4a05cb20505410eb322c..8815856bf1d7862dddd99bf8d791207ed46e438d 100644 --- a/include/darwin_registers.h +++ b/include/darwin_registers.h @@ -218,22 +218,14 @@ typedef enum { DARWIN_ADC_CH9_H = 0x0128, DARWIN_ADC_CH10_L = 0x0129, DARWIN_ADC_CH10_H = 0x012A, - DARWIN_ADC_CH11_L = 0x012B, - DARWIN_ADC_CH11_H = 0x012C, + DARWIN_ADC_TEMP_L = 0x012B, + DARWIN_ADC_TEMP_H = 0x012C, DARWIN_ADC_CH12_L = 0x012D, DARWIN_ADC_CH12_H = 0x012E, - DARWIN_ADC_CH13_L = 0x012F, - DARWIN_ADC_CH13_H = 0x0130, + DARWIN_ADC_VREF_L = 0x012F, + DARWIN_ADC_VREF_H = 0x0130, DARWIN_ADC_CH14_L = 0x0131, DARWIN_ADC_CH14_H = 0x0132, - DARWIN_ADC_TEMP_L = 0x0133, - DARWIN_ADC_TEMP_H = 0x0134, - DARWIN_ADC_CH16_L = 0x0135, - DARWIN_ADC_CH16_H = 0x0136, - DARWIN_ADC_VREF_L = 0x0137, - DARWIN_ADC_VREF_H = 0x0138, - DARWIN_ADC_CH18_L = 0x0139, - DARWIN_ADC_CH18_H = 0x013A, DARWIN_IMU_CNTRL = 0x013B, // bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 // accel_det | gyro_det | calibrating | running | | start_cal | stop | start DARWIN_IMU_CAL_SAMPLES_L = 0x013C, @@ -568,7 +560,7 @@ typedef enum { #define GPIO_BLUE_COLOR 0x7C00 #define ADC_BASE_ADDRESS 0x0115 -#define ADC_MEM_LENGTH 38 +#define ADC_MEM_LENGTH 30 #define ADC_START 0x01 #define ADC_STOP 0x02 #define ADC_RUNNING 0x10 diff --git a/src/adc_dma.c b/src/adc_dma.c index 1928371c122637e67f6e25af1c139ef63b209be4..d24f466d8bdf495add858283b077871a3f177eb5 100755 --- a/src/adc_dma.c +++ b/src/adc_dma.c @@ -2,76 +2,60 @@ #include "ram.h" #define ADC1_CH1 ADC_CHANNEL_0 -#define ADC1_CH2 ADC_CHANNEL_1 -#define ADC1_CH3 ADC_CHANNEL_2 -#define ADC1_CH4 ADC_CHANNEL_3 -#define ADC1_CH5 ADC_CHANNEL_4 -#define ADC1_CH6 ADC_CHANNEL_5 -#define ADC1_CH7 ADC_CHANNEL_6 -#define ADC1_CH8 ADC_CHANNEL_TEMPSENSOR -#define ADC1_CH9 ADC_CHANNEL_VREFINT - -#define ADC2_CH1 ADC_CHANNEL_7 -#define ADC2_CH2 ADC_CHANNEL_8 -#define ADC2_CH3 ADC_CHANNEL_9 -#define ADC2_CH4 ADC_CHANNEL_10 -#define ADC2_CH5 ADC_CHANNEL_11 -#define ADC2_CH6 ADC_CHANNEL_12 -#define ADC2_CH7 ADC_CHANNEL_13 -#define ADC2_CH8 ADC_CHANNEL_14 -#define ADC2_CH9 ADC_CHANNEL_15 +#define ADC1_CH2 ADC_CHANNEL_5 +#define ADC1_CH3 ADC_CHANNEL_6 +#define ADC1_CH4 ADC_CHANNEL_7 +#define ADC1_CH5 ADC_CHANNEL_8 +#define ADC1_CH6 ADC_CHANNEL_TEMPSENSOR +#define ADC1_CH7 ADC_CHANNEL_VREFINT + +#define ADC2_CH1 ADC_CHANNEL_9 +#define ADC2_CH2 ADC_CHANNEL_10 +#define ADC2_CH3 ADC_CHANNEL_11 +#define ADC2_CH4 ADC_CHANNEL_12 +#define ADC2_CH5 ADC_CHANNEL_13 +#define ADC2_CH6 ADC_CHANNEL_14 +#define ADC2_CH7 ADC_CHANNEL_15 #define ADC1_CH1_PIN GPIO_PIN_0 #define ADC1_CH1_PORT GPIOA #define ADC1_CH1_ENABLE_PORT_CLK __HAL_RCC_GPIOA_CLK_ENABLE() -#define ADC1_CH2_PIN GPIO_PIN_1 +#define ADC1_CH2_PIN GPIO_PIN_5 #define ADC1_CH2_PORT GPIOA #define ADC1_CH2_ENABLE_PORT_CLK __HAL_RCC_GPIOA_CLK_ENABLE() -#define ADC1_CH3_PIN GPIO_PIN_2 +#define ADC1_CH3_PIN GPIO_PIN_6 #define ADC1_CH3_PORT GPIOA #define ADC1_CH3_ENABLE_PORT_CLK __HAL_RCC_GPIOA_CLK_ENABLE() -#define ADC1_CH4_PIN GPIO_PIN_3 +#define ADC1_CH4_PIN GPIO_PIN_7 #define ADC1_CH4_PORT GPIOA #define ADC1_CH4_ENABLE_PORT_CLK __HAL_RCC_GPIOA_CLK_ENABLE() -#define ADC1_CH5_PIN GPIO_PIN_4 -#define ADC1_CH5_PORT GPIOA -#define ADC1_CH5_ENABLE_PORT_CLK __HAL_RCC_GPIOA_CLK_ENABLE() -#define ADC1_CH6_PIN GPIO_PIN_5 -#define ADC1_CH6_PORT GPIOA -#define ADC1_CH6_ENABLE_PORT_CLK __HAL_RCC_GPIOA_CLK_ENABLE() -#define ADC1_CH7_PIN GPIO_PIN_6 -#define ADC1_CH7_PORT GPIOA -#define ADC1_CH7_ENABLE_PORT_CLK __HAL_RCC_GPIOA_CLK_ENABLE() +#define ADC1_CH5_PIN GPIO_PIN_0 +#define ADC1_CH5_PORT GPIOB +#define ADC1_CH5_ENABLE_PORT_CLK __HAL_RCC_GPIOB_CLK_ENABLE() #define ADC1_ENABLE_CLK __ADC1_CLK_ENABLE() -#define ADC2_CH1_PIN GPIO_PIN_7 -#define ADC2_CH1_PORT GPIOA -#define ADC2_CH1_ENABLE_PORT_CLK __HAL_RCC_GPIOA_CLK_ENABLE() +#define ADC2_CH1_PIN GPIO_PIN_1 +#define ADC2_CH1_PORT GPIOB +#define ADC2_CH1_ENABLE_PORT_CLK __HAL_RCC_GPIOB_CLK_ENABLE() #define ADC2_CH2_PIN GPIO_PIN_0 -#define ADC2_CH2_PORT GPIOB -#define ADC2_CH2_ENABLE_PORT_CLK __HAL_RCC_GPIOB_CLK_ENABLE() +#define ADC2_CH2_PORT GPIOC +#define ADC2_CH2_ENABLE_PORT_CLK __HAL_RCC_GPIOC_CLK_ENABLE() #define ADC2_CH3_PIN GPIO_PIN_1 -#define ADC2_CH3_PORT GPIOB -#define ADC2_CH3_ENABLE_PORT_CLK __HAL_RCC_GPIOB_CLK_ENABLE() -#define ADC2_CH4_PIN GPIO_PIN_0 +#define ADC2_CH3_PORT GPIOC +#define ADC2_CH3_ENABLE_PORT_CLK __HAL_RCC_GPIOC_CLK_ENABLE() +#define ADC2_CH4_PIN GPIO_PIN_2 #define ADC2_CH4_PORT GPIOC #define ADC2_CH4_ENABLE_PORT_CLK __HAL_RCC_GPIOC_CLK_ENABLE() -#define ADC2_CH5_PIN GPIO_PIN_1 +#define ADC2_CH5_PIN GPIO_PIN_3 #define ADC2_CH5_PORT GPIOC #define ADC2_CH5_ENABLE_PORT_CLK __HAL_RCC_GPIOC_CLK_ENABLE() -#define ADC2_CH6_PIN GPIO_PIN_2 +#define ADC2_CH6_PIN GPIO_PIN_4 #define ADC2_CH6_PORT GPIOC #define ADC2_CH6_ENABLE_PORT_CLK __HAL_RCC_GPIOC_CLK_ENABLE() -#define ADC2_CH7_PIN GPIO_PIN_3 +#define ADC2_CH7_PIN GPIO_PIN_5 #define ADC2_CH7_PORT GPIOC #define ADC2_CH7_ENABLE_PORT_CLK __HAL_RCC_GPIOC_CLK_ENABLE() -#define ADC2_CH8_PIN GPIO_PIN_4 -#define ADC2_CH8_PORT GPIOC -#define ADC2_CH8_ENABLE_PORT_CLK __HAL_RCC_GPIOC_CLK_ENABLE() -#define ADC2_CH9_PIN GPIO_PIN_5 -#define ADC2_CH9_PORT GPIOC -#define ADC2_CH9_ENABLE_PORT_CLK __HAL_RCC_GPIOC_CLK_ENABLE() #define ADC2_ENABLE_CLK __ADC2_CLK_ENABLE() @@ -169,9 +153,9 @@ void ADC_DMA_IRQHandler(void) if(__HAL_DMA_GET_IT_SOURCE(&hdma_adc1, DMA_IT_TC) != RESET) { __HAL_DMA_CLEAR_FLAG(&hdma_adc1, __HAL_DMA_GET_TC_FLAG_INDEX(&hdma_adc1)); - for(i=0;i<9;i++) + for(i=0;i<7;i++) { - if(i==7) + if(i==5) { value=adc_convert_temperature(adc_data[i]&0x0000FFFF); ram_data[DARWIN_ADC_TEMP_L]=value%256; @@ -212,8 +196,6 @@ void adc_init(void) ADC1_CH3_ENABLE_PORT_CLK; ADC1_CH4_ENABLE_PORT_CLK; ADC1_CH5_ENABLE_PORT_CLK; - ADC1_CH6_ENABLE_PORT_CLK; - ADC1_CH7_ENABLE_PORT_CLK; ADC2_CH1_ENABLE_PORT_CLK; ADC2_CH2_ENABLE_PORT_CLK; ADC2_CH3_ENABLE_PORT_CLK; @@ -221,8 +203,6 @@ void adc_init(void) ADC2_CH5_ENABLE_PORT_CLK; ADC2_CH6_ENABLE_PORT_CLK; ADC2_CH7_ENABLE_PORT_CLK; - ADC2_CH8_ENABLE_PORT_CLK; - ADC2_CH9_ENABLE_PORT_CLK; ADC_ENABLE_DMA_CLK; @@ -234,7 +214,7 @@ void adc_init(void) hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; - hadc1.Init.NbrOfConversion = 9; + hadc1.Init.NbrOfConversion = 7; HAL_ADC_Init(&hadc1); multimode.Mode = ADC_DUALMODE_REGSIMULT; @@ -270,20 +250,15 @@ void adc_init(void) sConfig.Rank = 7; HAL_ADC_ConfigChannel(&hadc1, &sConfig); - sConfig.Channel = ADC1_CH8; - sConfig.Rank = 8; - HAL_ADC_ConfigChannel(&hadc1, &sConfig); - - sConfig.Channel = ADC1_CH9; - sConfig.Rank = 9; - HAL_ADC_ConfigChannel(&hadc1, &sConfig); - // configure GPIO - GPIO_InitStruct.Pin = ADC1_CH1_PIN|ADC1_CH2_PIN|ADC1_CH3_PIN|ADC1_CH4_PIN| - ADC1_CH5_PIN|ADC1_CH6_PIN|ADC1_CH7_PIN; + GPIO_InitStruct.Pin = ADC1_CH1_PIN|ADC1_CH2_PIN|ADC1_CH3_PIN|ADC1_CH4_PIN; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + GPIO_InitStruct.Pin = ADC1_CH5_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + ADC2_ENABLE_CLK; hadc2.Instance = ADC2; hadc2.Init.ScanConvMode = ADC_SCAN_ENABLE; @@ -291,7 +266,7 @@ void adc_init(void) hadc2.Init.DiscontinuousConvMode = DISABLE; hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;//ADC_EXTERNALTRIGCONV_T1_CC1; hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT; - hadc2.Init.NbrOfConversion = 9; + hadc2.Init.NbrOfConversion = 7; HAL_ADC_Init(&hadc2); // configure ADC2 channels @@ -324,27 +299,15 @@ void adc_init(void) sConfig.Rank = 7; HAL_ADC_ConfigChannel(&hadc2, &sConfig); - sConfig.Channel = ADC2_CH8; - sConfig.Rank = 8; - HAL_ADC_ConfigChannel(&hadc2, &sConfig); - - sConfig.Channel = ADC2_CH9; - sConfig.Rank = 9; - HAL_ADC_ConfigChannel(&hadc2, &sConfig); - // configure GPIO - GPIO_InitStruct.Pin = ADC2_CH4_PIN|ADC2_CH5_PIN|ADC2_CH6_PIN|ADC2_CH7_PIN| - ADC2_CH8_PIN|ADC2_CH9_PIN; + GPIO_InitStruct.Pin = ADC2_CH2_PIN|ADC2_CH3_PIN|ADC2_CH4_PIN|ADC2_CH5_PIN| + ADC2_CH6_PIN|ADC2_CH7_PIN; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - GPIO_InitStruct.Pin = ADC2_CH2_PIN|ADC2_CH3_PIN; - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - GPIO_InitStruct.Pin = ADC2_CH1_PIN; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //initialize DMA hdma_adc1.Instance = ADC_DMA_CHANNEL; @@ -403,7 +366,7 @@ void adc_init(void) HAL_ADCEx_Calibration_Start(&hadc2); HAL_ADC_Start(&hadc2); - HAL_ADCEx_MultiModeStart_DMA(&hadc1,adc_data,9); + HAL_ADCEx_MultiModeStart_DMA(&hadc1,adc_data,7); } void adc_start(void) @@ -461,18 +424,10 @@ uint16_t adc_get_channel(adc_ch_t channel) break; case ADC_CH10: value=ram_data[DARWIN_ADC_CH10_L]+ram_data[DARWIN_ADC_CH10_H]*256; break; - case ADC_CH11: value=ram_data[DARWIN_ADC_CH11_L]+ram_data[DARWIN_ADC_CH11_H]*256; - break; case ADC_CH12: value=ram_data[DARWIN_ADC_CH12_L]+ram_data[DARWIN_ADC_CH12_H]*256; break; - case ADC_CH13: value=ram_data[DARWIN_ADC_CH13_L]+ram_data[DARWIN_ADC_CH13_H]*256; - break; case ADC_CH14: value=ram_data[DARWIN_ADC_CH14_L]+ram_data[DARWIN_ADC_CH14_H]*256; break; - case ADC_CH16: value=ram_data[DARWIN_ADC_CH16_L]+ram_data[DARWIN_ADC_CH16_H]*256; - break; - case ADC_CH18: value=ram_data[DARWIN_ADC_CH18_L]+ram_data[DARWIN_ADC_CH18_H]*256; - break; default: value=0x0000; } @@ -505,18 +460,10 @@ uint16_t adc_get_channel_raw(adc_ch_t channel) break; case ADC_CH10: value=(adc_data[4]&0xFFFF0000)>>16; break; - case ADC_CH11: value=adc_data[5]&0x0000FFFF; - break; case ADC_CH12: value=(adc_data[5]&0xFFFF0000)>>16; break; - case ADC_CH13: value=adc_data[6]&0x0000FFFF; - break; case ADC_CH14: value=(adc_data[6]&0xFFFF0000)>>16; break; - case ADC_CH16: value=(adc_data[7]&0xFFFF0000)>>16; - break; - case ADC_CH18: value=(adc_data[8]&0xFFFF0000)>>16; - break; default: value=0x0000; } diff --git a/src/darwin_dyn_master_v2.c b/src/darwin_dyn_master_v2.c new file mode 100755 index 0000000000000000000000000000000000000000..392c5adc5f9c4f9b6f294e0f744ce85a1a1b928b --- /dev/null +++ b/src/darwin_dyn_master_v2.c @@ -0,0 +1,83 @@ +#include "darwin_dyn_master_v2.h" +#include "darwin_time.h" +#include "usart2.h" +#include "ram.h" + +#define ENABLE_RX_EN_GPIO_CLK __GPIOA_CLK_ENABLE() +#define RX_EN_PIN GPIO_PIN_4 +#define RX_EN_GPIO_PORT GPIOA + +#define ENABLE_TX_EN_GPIO_CLK __GPIOA_CLK_ENABLE() +#define TX_EN_PIN GPIO_PIN_1 +#define TX_EN_GPIO_PORT GPIOA + +/* private variables */ +TDynamixelMaster darwin_dyn_master_v2; +TTime darwin_dyn_master_v2_timer; +TComm darwin_dyn_master_v2_comm; + +// private functions +void darwin_dyn_master_v2_set_rx_mode(void) +{ + HAL_GPIO_WritePin(TX_EN_GPIO_PORT,TX_EN_PIN,GPIO_PIN_RESET); + HAL_GPIO_WritePin(RX_EN_GPIO_PORT,RX_EN_PIN,GPIO_PIN_SET); +} + +void darwin_dyn_master_v2_set_tx_mode(void) +{ + HAL_GPIO_WritePin(RX_EN_GPIO_PORT,RX_EN_PIN,GPIO_PIN_RESET); + HAL_GPIO_WritePin(TX_EN_GPIO_PORT,TX_EN_PIN,GPIO_PIN_SET); +} + +// public functions +void darwin_dyn_master_v2_init(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + TUSART_IRQ_Priorities priorities; + UART_InitTypeDef Init; + + // initialize timer structure + time_init(&darwin_dyn_master_v2_timer,darwin_time_get_counts_per_us(),darwin_time_get_counts); + + // initialize GPIO + ENABLE_RX_EN_GPIO_CLK; + ENABLE_TX_EN_GPIO_CLK; + + GPIO_InitStructure.Pin = RX_EN_PIN; + GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; + GPIO_InitStructure.Pull = GPIO_NOPULL; + HAL_GPIO_Init(RX_EN_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = TX_EN_PIN; + HAL_GPIO_Init(TX_EN_GPIO_PORT, &GPIO_InitStructure); + + darwin_dyn_master_v2_set_rx_mode(); + + /* initialize the comm object */ + comm_init(&darwin_dyn_master_v2_comm,0x01,&darwin_dyn_master_v2_timer); + Init.BaudRate = 1000000; + Init.WordLength = UART_WORDLENGTH_8B; + Init.StopBits = UART_STOPBITS_1; + Init.Parity = UART_PARITY_NONE; + Init.Mode = UART_MODE_TX_RX; + Init.HwFlowCtl = UART_HWCONTROL_NONE; + Init.OverSampling = UART_OVERSAMPLING_16; + + priorities.irq_priority=0; + priorities.irq_subpriority=2; + priorities.dma_rx_priority=1; + priorities.dma_rx_subpriority=1; + priorities.dma_tx_priority=1; + priorities.dma_tx_subpriority=0; + + usart2_init(&darwin_dyn_master_v2_comm,&Init,&priorities); + dyn_master_init(&darwin_dyn_master_v2,&darwin_dyn_master_v2_comm,DYN_VER2); + darwin_dyn_master_v2.set_rx_mode=darwin_dyn_master_v2_set_rx_mode; + darwin_dyn_master_v2.set_tx_mode=darwin_dyn_master_v2_set_tx_mode; + + /* configure dynamixel master module */ + dyn_master_set_rx_timeout(&darwin_dyn_master_v2,50); + dyn_master_set_return_level(&darwin_dyn_master_v2,return_all); +} +