CH10-ADC

主板原理图

扩展模块原理图
引脚表
引脚序号 |
主板引脚 |
扩展版模块引脚 |
1 |
5v |
|
2 |
PB6 |
LD1 |
3 |
GND |
GND |
4 |
PB7 |
LD2 |
5 |
==PB1==(ADC_IN9) |
AIN1 |
6 |
GND |
GND |
7 |
==PB0==(ADC_IN8) |
AIN2 |
8 |
PA8 |
|
9 |
VDD_NODE |
3V3 |
10 |
PB4 |
|
STM32L0_参考手册(L0x1).pdf
ADC 旨在提供与模拟电源和转换通道上施加的电压之间的比率相对应的数字值。对于大多数应用用例,有必要将该比率转换为独立于 VDDA 的电压。对于 VDDA 已知且 ADC 转换值右对齐的应用,您可以使用以下公式来获取该绝对值:
$$
\begin{aligned}
& {V_{CHANNELx}}= ADCD_ATAx\times \frac{V_{DDA}}{FULL_SCALE} \
\end{aligned}
$$
ADC_DATAx 是 ADC 在通道 x 上测量的值;
VDDA是内部参考电压(一般是3.3v);
FULL_SCALE 是 ADC 输出的最大数字值。例如,我们一般使用ADC采集是12 位分辨率,将为 2^12 - 1 = 4095。
CubeMX配置
MDK配置
CubeMX配置
下载线配置
ADC配置
Timer配置
Timer的NVIC配置
SPI配置1
由于SPI配置后只有三个引脚被配置,但数据通信时还有一个Lora通信SPI1_NSS对映的PA4需要配置为低电平
SPI配置2
OLED引脚配置
GPIO引脚配置
RTC配置
USART_DMA配置
USART参数配置
USART中断配置(IDLE)
NVIC配置
时钟树配置
生成文件配置1
生成文件配置2
MDK代码编写
ADC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| float* ADC_Read(void) { unsigned short int data[2]; static float adc_value[3]; for(char a=0;a<2;a++) { HAL_ADC_Start(&hadc); HAL_ADC_PollForConversion(&hadc,0XFFFFFF); data[a]=HAL_ADC_GetValue(&hadc); adc_value[a]=(float)data[a]*3.3/4095; } HAL_ADC_Stop(&hadc); adc_value[2]=adc_value[0]; adc_value[0]=adc_value[1]; adc_value[1]=adc_value[2]; return adc_value; }
|
function.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
| #include "function.h" #include "gpio.h" #include "stdio.h" #include "string.h" #include "oled.h" #include "lora.h"
extern UART_HandleTypeDef huart2; extern DMA_HandleTypeDef hdma_usart2_tx; extern DMA_HandleTypeDef hdma_usart2_rx;
extern I2C_HandleTypeDef hi2c3; extern RTC_HandleTypeDef hrtc; extern SPI_HandleTypeDef hspi1;
#define Usart_RX_buffer_len 100 unsigned char usart_rx_sec_len; unsigned char usart_rx_sec_flag; unsigned char usart_rx_buffer[Usart_RX_buffer_len];
void ALL_Init(void) { HAL_TIM_Base_Start_IT(&htim7); Usart_RX_Init(); IIC_OLED_Init(100); }
void Usart_RX_Init(void) { __HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE); HAL_UART_Receive_DMA(&huart2,usart_rx_buffer,Usart_RX_buffer_len); }
void Usart_RX_EXTI(void) { if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE) == SET) { __HAL_UART_CLEAR_IDLEFLAG(&huart2); HAL_UART_DMAStop(&huart2); usart_rx_sec_len = Usart_RX_buffer_len - __HAL_DMA_GET_COUNTER(&hdma_usart2_rx); usart_rx_sec_flag=1; } } void Usart_RX_DEAL(void) { if(usart_rx_sec_flag==1) {
if((Usart_RX_mess[0]=='L') && (Usart_RX_mess[1]=='E') && (Usart_RX_mess[2]=='D')) { HAL_UART_Transmit_DMA(&huart2,Usart_RX_mess,Usart_RX_sec_len); }
usart_rx_sec_flag=0; usart_rx_sec_len=0; HAL_UART_Receive_DMA(&huart2,usart_rx_buffer,Usart_RX_buffer_len); } }
unsigned char SPI_WriteRead(unsigned char addr,unsigned char mss) { extern SPI_HandleTypeDef hspi1; unsigned char tx_data[2],rx_data[2]; tx_data[0]=addr; tx_data[1]=mss; HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1,tx_data,rx_data,2,0xff); HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_SET); return rx_data[1]; }
void IIC_OLED_Init(unsigned char ms) { HAL_GPIO_WritePin(OLED_POWER_GPIO_Port, OLED_POWER_Pin, GPIO_PIN_RESET); HAL_Delay(ms); OLED_Init(); OLED_Clear(); }
void OLED_Write(unsigned char addr,unsigned char data) { unsigned char pdata[2]; pdata[0]=addr; pdata[1]=data; HAL_I2C_Master_Transmit(&hi2c3,0x78,pdata,2,0xff); }
unsigned char * RTC_Data(void) { static unsigned char rtc_data[7]; RTC_TimeTypeDef rtc_time_data; RTC_DateTypeDef rtc_date_data; HAL_RTC_GetTime(&hrtc,&rtc_time_data,RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc,&rtc_date_data,RTC_FORMAT_BIN); rtc_data[0]=rtc_date_data.Year; rtc_data[1]=rtc_date_data.Month; rtc_data[2]=rtc_date_data.WeekDay; rtc_data[3]=rtc_date_data.Date; rtc_data[4]=rtc_time_data.Hours; rtc_data[5]=rtc_time_data.Minutes; rtc_data[6]=rtc_time_data.Seconds; return rtc_data; }
int fputc(int ch,FILE *f) { HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,0xffff); return ch; }
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(USER_KEY_Pin==GPIO_Pin) { flag_send_rtc=1; } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { static int time_flag=0; if(htim7.Instance == TIM7) { if(++time_flag>1000) { time_flag=0; flag_num=1; } } }
|
function.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #ifndef __FUNCTION_H__ #define __FUNCTION_H__
void Layer_switch(const unsigned char layer_choose,const unsigned char layer_state);
void IDLE_RX_Init(void); void IDLE_RX_Exit(void); void IDLE_RX_Deal(void);
void Usart_puplish(const unsigned char *ms,const unsigned char ms_len);
unsigned char * RTC_Read(void);
unsigned char SPI_WriteRead(unsigned char addr,unsigned char mss);
void OLED_A_Init(unsigned char time_delay); void OLED_Write(unsigned char addr,unsigned char mss);
void ALL_Init(void);
#endif
|
main.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
| #include "function.h" #include "stdio.h" #include "string.h" #include "oled.h" #include "lora.h"
int main(void) { ALL_Init(); extern unsigned char flag_num; extern unsigned char oled_2_pub[16]; unsigned char *rtc_rec_data; unsigned char oled_1_pub[16]; unsigned char oled_3_pub[16]; unsigned char lora_a_rx[5]; while (1) { rtc_rec_data=RTC_Read(); if(1==flag_num) { flag_num=0; printf("\r\n RTC:%d-%d-%d %02d:%02d:%02d \r\n",2000+rtc_rec_data[0],rtc_rec_data[1],rtc_rec_data[3],rtc_rec_data[4],rtc_rec_data[5],rtc_rec_data[6]); } sprintf((char *)oled_1_pub,"RTC:%02d:%02d:%02d",rtc_rec_data[4],rtc_rec_data[5],rtc_rec_data[6]); OLED_ShowString(0,oled_1_pub); LORA_Tx(rtc_rec_data,7); LORA_Rx(lora_a_rx); sprintf((char *)oled_3_pub,"EX:%02d",lora_a_rx[0]); OLED_ShowString(2,oled_3_pub);
IDLE_RX_Deal(); } }
|