1s定时器。
HAL_TIM_Base_Start_IT(&htim6);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM6)
{
static uint16_t index = 0;
TIM1->CCR1 = sine_table[index];
TIM1->CCR2 = 900U - sine_table[index];
index = (index + 1U) % 100U;
TIMFLAG=1;
}
}
uint16_t adc_value[2];
float voltage_in0=0;
float voltage_in1=0;
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adc_value,2);
voltage_in0 = adc_value[0] * 3.28f / 4095.0f;
voltage_in1 = adc_value[1] * 3.28f / 4095.0f;
printf("voltage_in0:%.3f,voltage_in1:%.3f\r\n",voltage_in0,voltage_in1);
uint32_t last_tick = 0;
if (HAL_GetTick() - last_tick >= 1000)
{
last_tick = HAL_GetTick();
voltage_in0 = adc_value[0] * 3.28f / 4095.0f;
voltage_in1 = adc_value[1] * 3.28f / 4095.0f;
printf("voltage_in0:%.3f,voltage_in1:%.3f\r\n",voltage_in0,voltage_in1);
}
打印浮点数
IDE
#include <stdio.h>
int __io_putchar(int ch)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
printf("nihaopgg\r\n");
IAR
#include <stdio.h>
size_t __write(int handle, const unsigned char *buffer, size_t size)
{
(void)handle;
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, size, HAL_MAX_DELAY);
return size;
}
串口发送数据#include "string.h"
#include "stdlib.h"
uint8_t rxBuf[7];
if (HAL_UART_Receive(&huart1, rxBuf, 7, 10) == HAL_OK)
{
// HAL_UART_Transmit(&huart1, rxBuf, 7, 100);
rxBuf[5] = '\0';
b = atof((char *)rxBuf);
printf("b:%.3f\r\n",b);
// PID_SetTarget(&dac_pid,b*4095/3.3);
PID_SetTarget(&dac_pid,b);
if (strcmp((char *)rxBuf, "2.000") == 0)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
}
}
打开输入捕获中断
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2);
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_3);
ADC相关
HAL_ADCEx_Calibration_Start(&hadc1); //启动内部校准
HAL_ADC_Start(&hadc3); // 先启动转换
HAL_ADC_PollForConversion(&hadc3, 10); // 等待转换完成
adcval1=HAL_ADC_GetValue(&hadc3);
DAC相关
HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 1888);
注意DAC不要开始软件触发 否则需 // DAC->SWTRIGR |= DAC_SWTRIGR_SWTRIG1; 才能触发
PID相关
PID.c PID.h 复制过来
float piddac=0;
PID_TypeDef dac_pid;;
PID_Init(&dac_pid, 1025.0f, 125.00f, 0.0f);
piddac=PID_Calc(&dac_pid,adcval);
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, piddac);
或 TIM1->CCR1=piddac;
ADC+DMA+采完回调
uint16_t adc_buf[GOERTZEL_BUFFER_SIZE];
HAL_ADCEx_Calibration_Start(&hadc1); //校准ADC
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_buf, GOERTZEL_BUFFER_SIZE);
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
static uint8_t first_block = 1;
if(hadc->Instance == ADC1)
{
if (first_block == 1)
{
first_block = 0;
return;
}
memcpy(analysis_buf, adc_buf, sizeof(analysis_buf));
tx_index++;
if (tx_index == 8)
{
tx_index = 0;
}
BFSK_Send_Bit(tx_data[tx_index]);
uint8_t bit = Goertzel_Detect(analysis_buf);
Receive_Bit(bit);
}
}
DAC+DMA
HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *)samples,
sample_count, DAC_ALIGN_12B_R);
PWM互补输出
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1); //要启动两次
/
Prescaler -> TIM1->PSC // 预分频值
Period -> TIM1->ARR // PWM周期
Pulse CH1 -> TIM1->CCR1 // CH1占空比
Pulse CH2 -> TIM1->CCR2
Pulse CH3 -> TIM1->CCR3
Pulse CH4 -> TIM1->CCR4
当前计数值 -> TIM1->CNT
/
|