Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Другие темы раздела
ARM, Cortex, STM32 микроконтроллер STM32 + RAM(no name) http://www.cyberforum.ru/arm/thread1822578.html
Привет. У себя в "мусоре" нашел несколько плат с чипамя похожими на оперативку, хочу знать какие из них можно подключить к STM32, и как. ДШ не на один чип не нашел. Чипы на старой видюхе (nvidia...
ARM, Cortex, STM32 микроконтроллер Файловая система Смарт карты, как создать? Есть на форуме кто то кто создавал файловую систему на "пустой" карте? В какой момент она создается и какой функциональностью должна обладать ОС в этот момент? Есть ли пример программной реализации... http://www.cyberforum.ru/arm/thread1819703.html
ARM, Cortex, STM32 микроконтроллер Литературы для 1986Е93У
На 3 курсе стали изучать программирования МК, и обучаемся мы на (МК фирмы Миландр 1986Е93У с ядром ARM Cortex-M3). Скажите название книги или книг, по которой можно хоть что то понять с...
STM32F7-SOM ARM, Cortex, STM32 микроконтроллер
Требуется сделать конфигурационный файл с FreeRTOS для платы STM32F7-SOM производителя EMCraft на базе контроллера ST Micro серии F7 (Cortex-M7) в программе STM32CubeMX. Затем надо разработать...
ARM, Cortex, STM32 микроконтроллер LPC214X. Нужно добавить комментарии к коду на Си и АСМ (задание 2) http://www.cyberforum.ru/arm/thread1816428.html
Закомментируйте пожалуйста эту программу, а то в книги нету толкового объяснения #include <stdio.h> #include <string.h> #include <LPC214X.H> extern "C" void init_serial(void); __asm void...
ARM, Cortex, STM32 микроконтроллер System Workbench for STM32 + Кубик. Отзывы, нюансы, обучение Доброго времени суток. Решил я изучить еще один инструмент, под названием "System Workbench for STM32", до сегодняшнего дня сидел на IAR, резких движений делать не хочу, ибо на работе и так первый... подробнее
now100
1 / 1 / 0
Регистрация: 12.10.2016
Сообщений: 24
17.10.2016, 16:10  [ТС] 0

STMF103C8T6 и HC-SR04. Вывод данных. Нужен код

17.10.2016, 16:10. Просмотров 1608. Ответов 10
Метки (Все метки)

Ответ

Взял для теста код с http://www.avislab.com/blog/stm32-tim-capture/
В терминале постоянно число 20.
Вывожу на терминал значение Sonar вместо значения sonar_get() - в терминале :
STMF103C8T6 и HC-SR04. Вывод данных. Нужен код


Значения не зависят от расстояния между датчиком и препятствием.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_tim.h"
#include "stdio.h"
#include "misc.h"
 
volatile uint8_t FLAG_ECHO = 0;
volatile uint16_t SonarValue;
 
void SetSysClockTo72(void)
{
    ErrorStatus HSEStartUpStatus;
    /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
    /* RCC system reset(for debug purpose) */
    RCC_DeInit();
 
    /* Enable HSE */
    RCC_HSEConfig( RCC_HSE_ON);
 
    /* Wait till HSE is ready */
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
 
    if (HSEStartUpStatus == SUCCESS)
    {
        /* Enable Prefetch Buffer */
        //FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable);
 
        /* Flash 2 wait state */
        //FLASH_SetLatency( FLASH_Latency_2);
 
        /* HCLK = SYSCLK */
        RCC_HCLKConfig( RCC_SYSCLK_Div1);
 
        /* PCLK2 = HCLK */
        RCC_PCLK2Config( RCC_HCLK_Div1);
 
        /* PCLK1 = HCLK/2 */
        RCC_PCLK1Config( RCC_HCLK_Div2);
 
        /* PLLCLK = 8MHz * 9 = 72 MHz */
        RCC_PLLConfig(0x00010000, RCC_PLLMul_9);
 
        /* Enable PLL */
        RCC_PLLCmd( ENABLE);
 
        /* Wait till PLL is ready */
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
        {
        }
 
        /* Select PLL as system clock source */
        RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK);
 
        /* Wait till PLL is used as system clock source */
        while (RCC_GetSYSCLKSource() != 0x08)
        {
        }
    }
    else
    { /* If HSE fails to start-up, the application will have wrong clock configuration.
     User can add here some code to deal with this error */
 
        /* Go to infinite loop */
        while (1)
        {
        }
    }
}
 
void sonar_init() {
    GPIO_InitTypeDef gpio_cfg;
    GPIO_StructInit(&gpio_cfg);
 
    /* Timer TIM3 enable clock */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
 
    /* Timer TIM3 settings */
    TIM_TimeBaseInitTypeDef timer_base;
    TIM_TimeBaseStructInit(&timer_base);
    timer_base.TIM_CounterMode = TIM_CounterMode_Up;
    timer_base.TIM_Prescaler = 72;
    TIM_TimeBaseInit(TIM3, &timer_base);
    TIM_Cmd(TIM3, ENABLE);
 
    //Trigger Pin
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    gpio_cfg.GPIO_Mode = GPIO_Mode_Out_PP;
    gpio_cfg.GPIO_Pin = GPIO_Pin_15;
    GPIO_Init(GPIOB, &gpio_cfg);
 
    //EXTI
 
    /* Set variables used */
    GPIO_InitTypeDef GPIO_InitStruct;
    EXTI_InitTypeDef EXTI_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;
 
    /* Enable clock for AFIO */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
 
    /* Set pin as input */
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);
 
    /* Add IRQ vector to NVIC */
    /* PB0 is connected to EXTI_Line0, which has EXTI0_IRQn vector */
    NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
    /* Set priority */
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
    /* Set sub priority */
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
    /* Enable interrupt */
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    /* Add to NVIC */
    NVIC_Init(&NVIC_InitStruct);
 
    /* Tell system that you will use PB0 for EXTI_Line0 */
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
 
    /* PD0 is connected to EXTI_Line0 */
    EXTI_InitStruct.EXTI_Line = EXTI_Line0;
    /* Enable interrupt */
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    /* Interrupt mode */
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    /* Triggers on rising and falling edge */
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
    /* Add to EXTI */
    EXTI_Init(&EXTI_InitStruct);
}
 
void EXTI0_IRQHandler(void) {
    /* Make sure that interrupt flag is set */
    if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
        if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) != 0) {
            // Rising
            TIM_SetCounter(TIM3, 0);
        }
        if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0) {
            // Falling
            SonarValue = TIM_GetCounter(TIM3);
        }
 
        /* Clear interrupt flag */
        EXTI_ClearITPendingBit(EXTI_Line0);
    }
}
 
void sonar_start() {
    int i;
 
    GPIO_SetBits(GPIOB, GPIO_Pin_15);
    //Delay 0x72000
    for(i=0;i<0x7200;i++);
    GPIO_ResetBits(GPIOB, GPIO_Pin_15);
}
 
unsigned int sonar_get() {
    unsigned long Sonar;
    // 354000 - Sound speed (mm/sec)
    // 72000000 - F_CPU
    // 16 - Timer Prescaler
    // Result = mm
    Sonar = (354/2) * (unsigned long)SonarValue / (72000 / 72);
    if (Sonar > 4000) Sonar = 4000;
    if (Sonar < 20) Sonar = 20;
 
    return (unsigned int)Sonar;
}
 
 
void usart_init(void)
{
    /* Enable USORT1 and GPIOA clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USORT1 | RCC_APB2Periph_GPIOA, ENABLE);
 
    /* Configure the GPIOs */
    GPIO_InitTypeDef GPIO_InitStructure;
 
    /* Configure USORT1 Tx (PA.09) as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
 
    /* Configure USORT1 Rx (PA.10) as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
 
    /* Configure the USORT1 */
    USORT_InitTypeDef USORT_InitStructure;
 
    /* USORT1 configuration ------------------------------------------------------*/
    /* USORT1 configured as follow:
              - BaudRate = 115200 baud
              - Word Length = 8 Bits
              - One Stop Bit
              - No parity
              - Hardware flow control disabled (RTS and CTS signals)
              - Receive and transmit enabled
              - USORT Clock disabled
              - USORT CPOL: Clock is active low
              - USORT CPHA: Data is captured on the middle
              - USORT LastBit: The clock pulse of the last data bit is not output to
                               the SCLK pin
     */
    USORT_InitStructure.USORT_BaudRate = 115200;
    USORT_InitStructure.USORT_WordLength = USORT_WordLength_8b;
    USORT_InitStructure.USORT_StopBits = USORT_StopBits_1;
    USORT_InitStructure.USORT_Parity = USORT_Parity_No;
    USORT_InitStructure.USORT_HardwareFlowControl = USORT_HardwareFlowControl_None;
    USORT_InitStructure.USORT_Mode = USORT_Mode_Rx | USORT_Mode_Tx;
 
    USORT_Init(USORT1, &USORT_InitStructure);
 
    /* Enable USORT1 */
    USORT_Cmd(USORT1, ENABLE);
}
 
void USORTSend(char *pucBuffer)
{
    while (*pucBuffer)
    {
        USORT_SendData(USORT1, *pucBuffer++);
        while(USORT_GetFlagStatus(USORT1, USORT_FLAG_TC) == RESET)
        {
        }
    }
}
 
void TIM4_IRQHandler(void)
{
        if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
        {
            sonar_start();
            FLAG_ECHO = 1;
            TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
        }
}
 
int main(void)
{
    char buffer[80] = {'\0'};
 
    SetSysClockTo72();
 
    // TIMER4 Двічи за секунду викликає sonar_start(); і встановлює FLAG_ECHO = 1;
    TIM_TimeBaseInitTypeDef TIMER_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
    TIM_TimeBaseStructInit(&TIMER_InitStructure);
    TIMER_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIMER_InitStructure.TIM_Prescaler = 7200;
    TIMER_InitStructure.TIM_Period = 5000;
    TIM_TimeBaseInit(TIM4, &TIMER_InitStructure);
    TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
    TIM_Cmd(TIM4, ENABLE);
 
    /* NVIC Configuration */
    /* Enable the TIM4_IRQn Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
 
    usart_init();
    sonar_init();
 
    while(1)
    {
        if (FLAG_ECHO == 1) {
            sprintf(buffer, "%d\r\n", sonar_get());
            USORTSend(buffer);
 
            FLAG_ECHO = 0;
        }
    }
}


Вернуться к обсуждению:
STMF103C8T6 и HC-SR04. Вывод данных. Нужен код
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2016, 16:10
Готовые ответы и решения:

HC-SR04 ультра звуковой датчик .вывод показаний с задержкой
Купил ультра звуковой датчик по эксперементировать с ним,подключил дисплей на дисплей выводятся...

ЕСТЬ КОД НУЖЕН ВВОД И ВЫВОД В ФАЙЛ СДЕЛАТЬ
заполнить массив змейкой начиная с 1 элемента пример 1 2 3 4 8 7 6 5 9 10 11 12...

Нужен код обновления данных
При нажатии на кнопку нужно изменить данные у выбранной записи в поле БД SQL. Код нужно написать в...

Нужен программный код.«Обработка строковых данных».
Дан текст из цифр и строчных латинских букв, за которым следует точка. Определите, каких букв —...

Мой код импорта данных в БД. Нужен совет
Всем привет. Скидываю код. Здесь идет загрузка файла на сервер, а затем импорт данных из него и...

10
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru