银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2020-04-13 | gingko | 初次建立 |
1. 新建工程:在主界面选择File–>New Project 或者直接点击ACCEE TO MCU SELECTOR 2. 出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置 在搜索栏的下面,提供的各种查找方式,可以选择芯片内核、型号等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32F407IGTx。 3. 配置RCC,使用外部时钟源 4. 配置调试引脚 5. 将LED对应的3个引脚(PI5,PI6,PI7)设置为GPIO_Output 6. 引脚模式配置 7. 配置ADC引脚 8. 配置UART 9. 时钟源设置,选择外部高速时钟源,配置为最大主频 10. 工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK5 11. 点击Code Generator,进行进一步配置
自行选择方式即可
12. 然后点击GENERATE CODE 创建工程 创建成功,打开工程。
监测内容 | ADC选用 | 选用引脚 | |
1 | 5V电压 | ADC1-14通道 | PC4 |
2 | 输入电流 | ADC1-15通道 | PC5 |
3 | 1.2V电压 | ADC3-15通道 | PF5 |
4 | 3.3V电压 | ADC3-4通道 | PF6 |
5 | 2.5V电压 | ADC3-5通道 | PF7 |
int main(void) { int i; HAL_Init(); SystemClock_Config(); //配置系统时钟 MX_GPIO_Init(); //初始化所有已配置的外围设备 MX_ADC1_Init(); MX_ADC3_Init(); MX_UART4_Init(); LED_RED_ON; //红灯亮 while (1) { //ADC监控电源 for(i = 0;i < 100000;i++); for(i = 0;i < 5;i++){ adc.read(i); } uart4.printf("\x0c"); //清屏 uart4.printf("\033[1;32;40m");//字体终端设置为绿色 uart4.printf("\r\n\r\nhello! I am iCore3!\r\n\r\n\r\n"); //在串口终端打印“Hello! I am iCore3” //打印系统供电电压 uart4.printf(" [V] %4.2fV\r\n",adc1_3.value[0]*6); uart4.printf(" [I] %3.0fmA\r\n",adc1_3.value[1] / 2* 1000); uart4.printf(" [1.2V] %4.2fV\r\n",adc1_3.value[2]); uart4.printf(" [3.3V] %4.2fV\r\n",adc1_3.value[3] * 2); uart4.printf(" [2.5V] %4 } }
ADC_HandleTypeDef hadc1; ADC_HandleTypeDef hadc3;
typedef struct { ADC__TypeDef *Instance; //ADC寄存器基地址 ADC_InitTypeDef Init; //ADC所需参数 __IO uint32_t NbrOfCurrentConversionRank; //当前转换列的ADC数 DMA_HandleTypeDef *DMA_Handle; //指针DMA处理程序 HAL_LockTypeDef Lock; //锁定对象 __IO uint32_t State; //ADC通信状态 __IO uint32_t ErrorCode; //ADC错误代码 } ADC_HandleTypeDef;
typedef struct { uint32_t Channel; //指定要配置为ADC常规组的通道。 uint32_t Rank; //指定常规组序列器中的列组,此参数必须是介于Min Data=1和Max Data=16之间的数字 uint32_t SamplingTime; //要为选定通道设置的采样时间值。 uint32_t Offset; //保留供将来使用,可设置为0 }ADC_ChannelConfTypeDef;
HAL_StatusTypeDef HAL_ADC_ConfigChannel (ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig)
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc)
void sort(unsigned short int a[], int n) { int i, j, t; //元素从大到小排列 for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (a[j] > a[j + 1]) { t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; } } } } static int read_adc(int channel) { int i,k; unsigned long int temp[20] = {0}; unsigned long int value; unsigned short int data[100]; ADC_ChannelConfTypeDef channel_config; unsigned char channel_remap[5] = {ADC_CHANNEL_14,ADC_CHANNEL_15,ADC_CHANNEL_15,ADC_CHANNEL_4,ADC_CHANNEL_5}; //取得到的100个转换值的中间的20个的平均值作为结果 //连续取20次这样的平均值,再求平均值作为最终结果 channel_config.Channel = channel_remap[channel]; channel_config.Rank = 1; channel_config.SamplingTime = ADC_SAMPLETIME_3CYCLES; if(channel == 0 || channel == 1){ HAL_ADC_ConfigChannel(&hadc1,&channel_config); }else { HAL_ADC_ConfigChannel(&hadc3,&channel_config); } for(k = 0;k < 20;k++){ //取20组数值做滤波 for(i = 0;i < 100;i++){ if(channel == 0 || channel == 1){ HAL_ADC_Start(&hadc1); //开启ADC1采集通道 while(!__HAL_ADC_GET_FLAG(&hadc1,ADC_FLAG_EOC));//等待转换结束 data[i] = HAL_ADC_GetValue(&hadc1); //将结果保存 }else { HAL_ADC_Start(&hadc3); //开启ADC3采集通道 while(!__HAL_ADC_GET_FLAG(&hadc3,ADC_FLAG_EOC));//等待转换结束 data[i] = HAL_ADC_GetValue(&hadc3); //将结果保存 } } sort(data,100); for(i = 40;i < 60;i++){ // 对采集到的数值做均值滤波处理 temp[k] += data[i]; } temp[k] = temp[k] / 20; } value = 0; for(k = 0;k < 20;k++){ value += temp[k]; } value /= 20; adc13.value[channel] = value * ADC_REF / 4096; //12位的ADC满量程为2^12=4096,参考电压ADC_REF 为2.483V return value; }