这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32F103C8T6的PWM输出制作四路降压模块

共1条 1/1 1 跳转至

STM32F103C8T6的PWM输出制作四路降压模块

菜鸟
2024-12-24 05:43:35     打赏

我在工作中会用到5V12V等常见的电压输出,由于使用开关电源做输出比较麻烦,所以设置一个四路的降压模块,现在将其分享出来给大家参考一下。

降压电路部分采用XL4015左右电压芯片,选用该芯片的考虑点是宽电压输入 8V-36V范围,这个范围基本上在工作中比较容易找到,效率也比较高,具体参数如下图:

图片1.png

设计的电路图如下:

图片2.png

由于单片机采用3.3V工作电压,所以固定一路输出为5V输出,该输出电压也可以为其他负载提供电压输出,在PCB布局时,将5V3.3V输出引出外部提供电压输出。

二:屏幕显示使用的IIC接口的OLED屏幕:资料如下:

采用i2C接口的1.3寸的12864 OLED模块显示,采用该屏幕主要是接线方便,对屏幕的刷新速度要求不高,只是用作显示电压使用;缺点是单色的,看起来并不是很友好。

图片3.png


软件控制部分:硬件设计资料:采用STM32的定时器4PWM输出功能,为了使输出的电压恒定,输出电压经过了两次RC电路,然后 进入运放LM358,这个运放工作时,不需要负电压就可以,而且价格便宜,图纸如下

图片4.png

电压采集部分:将XL4015输出端的电压经过电阻分压进入单片机的ADC采样口,设置分压电路时,需要注意下,输出电压最大时,不能超过单片IO口最高的承受电压的能力。这里需要将输出电压进入单片机内部进行采集,用于检测PWM输出是否正常。

图片5.png

实物测试图片如下:

实物测试图片如下:

主要软件代码如下:

利用ADC检测电压输出是否正常:

view plaincopy to clipboardprint?

  1. //单通道 DMA adc数据  

  2. volatile u16 adc_values;  

  3. volatile u16 adc_buf[400];  

  4.   

  5. //-------------单通道 ADC读取----------------  

  6. void Adc_Init(void) {  

  7.     ADC_InitTypeDef ADC_InitStructure;  

  8.     GPIO_InitTypeDef GPIO_InitStructure;  

  9.    

  10.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);  

  11.     RCC_ADCCLKConfig(RCC_PCLK2_Div6);//72/6 = 12MHz  

  12.     //ADC1通道11的转换时间为T=(239.5+12.5) x 1/12=21us。  

  13.    

  14.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;  

  15.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  

  16.     GPIO_Init(GPIOA, &GPIO_InitStructure);   

  17.     ADC_DeInit(ADC1);//复位ADC1  

  18.     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC 独立模式  

  19.     ADC_InitStructure.ADC_ScanConvMode = DISABLE;//单次扫描模式  

  20.     ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//单次转换模式  

  21.     ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;//ADC1 和ADC2 工作在同步规则模式  

  22.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//软件触发  

  23.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐  

  24.     ADC_InitStructure.ADC_NbrOfChannel = 1 ;//进行规则转换的ADC通道数量  

  25.     ADC_Init(ADC1, &ADC_InitStructure);//初始化ADC1  

  26.     ADC_Cmd(ADC1, ENABLE);  

  27.     ADC_ResetCalibration(ADC1);//开启复位校准  

  28.     while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准成功  

  29.     ADC_StartCalibration(ADC1);//开始校验ADC1  

  30.     while(ADC_GetCalibrationStatus(ADC1));//等待校验成功  

  31. }  

  32. u16 get_ADC_Values(u8 ch, u8 rank) {  

  33.    

  34.     //设置指定ADC规则通道,设置转换时间  

  35.     ADC_RegularChannelConfig(ADC1, ch, rank, ADC_SampleTime_239Cycles5);  

  36.     ADC_SoftwareStartConvCmd(ADC1, ENABLE); //开启软件转换  

  37.     while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //等待转换结束  

  38.     return     ADC_GetConversionValue(ADC1);  

  39. }  

  40. //返回ADC平均值  

  41. u16 get_ADC_Average(u8 ch, u8 rank, u8 count) {  

  42.     u32 temp_val = 0;  

  43.     u8 i;  

  44.    

  45.     for(i = 0; i < count; i++) {  

  46.         temp_val += get_ADC_Values(ch, rank);  

  47.         delay_ms(5);  

  48.     }  

  49.     return temp_val / count;   

  50. }  

  51. //-------------单通道 ADC DMA读取----------------  

  52. void ADC_DMA_Init(void) {  

  53.     GPIO_InitTypeDef GPIO_InitStructure;  

  54.     ADC_InitTypeDef ADC_InitStructure;  

  55.     DMA_InitTypeDef DMA_InitStructure;  

  56.       

  57.     //使能DMA1时钟  

  58.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);    

  59.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);        

  60.     

  61.         //初始化IO   

  62.     GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;          

  63.     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;    

  64.     GPIO_Init(GPIOA,&GPIO_InitStructure);    

  65.    

  66.     //复位DMA1 通道1 ADC  

  67.     DMA_DeInit(DMA1_Channel1);  

  68.     DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;//ADC内存基地址  

  69.     DMA_InitStructure.DMA_MemoryBaseAddr  = (u32)&adc_values;//变量基地址  

  70.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//外设到内存  

  71.     DMA_InitStructure.DMA_BufferSize = 1;//数据宽度  

  72.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设内存地址不变  

  73.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//变量内存地址不变  

  74.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//16字节 12位ADC  

  75.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//16字节  

  76.     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//循环模式  

  77.     DMA_InitStructure.DMA_Priority = DMA_Priority_High;//高优先级  

  78.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//关闭内存到内存传输  

  79.     DMA_Init(DMA1_Channel1, &DMA_InitStructure);//初始化DMA1 通道1  

  80.     DMA_Cmd(DMA1_Channel1, ENABLE);//使能DMA 通道1  

  81.    

  82.     ADC_DeInit(ADC1);//复位ADC1  

  83.     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式  

  84.     ADC_InitStructure.ADC_ScanConvMode = DISABLE; //关闭扫描  

  85.     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //开启连续转换 触发一次 持续转换  

  86.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//软件触发转换  

  87.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐  

  88.     ADC_InitStructure.ADC_NbrOfChannel = 1;//转换一个通道  

  89.     ADC_Init(ADC1, &ADC_InitStructure);//初始化ADC  

  90.         //ADC时钟 不能大于14MHz  

  91.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);//72/6 = 12MHz   

  92.         //设置指定ADC规则通道,设置转换时间  

  93.     ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);  

  94.     //使能ADC DMA  

  95.         ADC_DMACmd(ADC1, ENABLE);  

  96.         //使能ADC  

  97.     ADC_Cmd(ADC1, ENABLE);  

  98.           

  99.         ADC_ResetCalibration(ADC1);//复位校准寄存器    

  100.     while(ADC_GetResetCalibrationStatus(ADC1));//等待校准寄存器复位完成    

  101.     

  102.     ADC_StartCalibration(ADC1);//ADC校准    

  103.     while(ADC_GetCalibrationStatus(ADC1));//等待校准完成    

  104.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);//由于没有采用外部触发,所以使用软件触发ADC转换   

  105.           

  106. }  

  107. //返回ADC平均值  

  108. u16 get_ADC_DMA_Average(u8 count) {  

  109.     u32 temp_val = 0;  

  110.     u8 i;  

  111.    

  112.     for(i = 0; i < count; i++) {  

  113.         temp_val += adc_values;  

  114.         delay_ms(5);  

  115.     }  

  116.     return temp_val / count;  

  117.    

  118. }  

  119. //-------------多通道 ADC DMA读取----------------  

  120. void ADC_DMA_Multichannel_Init(uint16_t *ADC_Buff) {  

  121.     GPIO_InitTypeDef GPIO_InitStructure;  

  122.     ADC_InitTypeDef ADC_InitStructure;  

  123.     DMA_InitTypeDef DMA_InitStructure;  

  124.       

  125.     //使能DMA1时钟  

  126.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);    

  127.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);        

  128.     

  129.         //初始化IO   

  130.     GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;          

  131.     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;    

  132.     GPIO_Init(GPIOA,&GPIO_InitStructure);    

  133.    

  134.     //复位DMA1 通道1 ADC  

  135.     DMA_DeInit(DMA1_Channel1);  

  136.     DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;//ADC内存基地址  

  137.     DMA_InitStructure.DMA_MemoryBaseAddr  = (u32)ADC_Buff;//变量基地址  

  138.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//外设到内存  

  139.     DMA_InitStructure.DMA_BufferSize = 400;//数据宽度  

  140.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设内存地址不变  

  141.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//变量内存地址增长  

  142.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//16字节 12位ADC  

  143.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//16字节  

  144.     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//循环模式  

  145.     DMA_InitStructure.DMA_Priority = DMA_Priority_High;//高优先级  

  146.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//关闭内存到内存传输  

  147.     DMA_Init(DMA1_Channel1, &DMA_InitStructure);//初始化DMA1 通道1  

  148.     DMA_Cmd(DMA1_Channel1, ENABLE);//使能DMA 通道1  

  149.    

  150.     ADC_DeInit(ADC1);//复位ADC1  

  151.     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式  

  152.     ADC_InitStructure.ADC_ScanConvMode = ENABLE; //开启扫描 多通道读取   

  153.     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //开启连续转换 触发一次 持续转换  

  154.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//软件触发转换  

  155.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐  

  156.     ADC_InitStructure.ADC_NbrOfChannel = 4;//转换3个通道  

  157.     ADC_Init(ADC1, &ADC_InitStructure);//初始化ADC  

  158.           

  159.   //ADC时钟 不能大于14MHz  

  160.   RCC_ADCCLKConfig(RCC_PCLK2_Div6);//72/6 = 12MHz   

  161.   //设置指定ADC规则通道,设置转换时间  

  162.    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_13Cycles5);  

  163.    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_13Cycles5);  

  164.    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_13Cycles5);  

  165.    ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_13Cycles5);  

  166.     //使能ADC DMA  

  167.         ADC_DMACmd(ADC1, ENABLE);  

  168.     //使能ADC  

  169.     ADC_Cmd(ADC1, ENABLE);  

  170.           

  171.         ADC_ResetCalibration(ADC1);//复位校准寄存器    

  172.     while(ADC_GetResetCalibrationStatus(ADC1));//等待校准寄存器复位完成    

  173.     

  174.     ADC_StartCalibration(ADC1);//ADC校准    

  175.     while(ADC_GetCalibrationStatus(ADC1));//等待校准完成    

  176.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);//由于没有采用外部触发,所以使用软件触发ADC转换   

  177.           

  178. }  






关键词: STM32F103C8T6    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]