打印
[STM32F4]

项目中用到的STM32F429IGT6经验之ADC

[复制链接]
329|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laocuo1142|  楼主 | 2020-11-5 15:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这里面不是用的HAL库,直接操作的寄存器,有需要的朋友可以参考参考,哈哈。
很多时候库是很好的,但是想应用的灵活,还是要了解和学习一下芯片的寄存器。
//初始化ADC
void Adc1_Init(void)
{   
// 先初始化IO口
  RCC->APB2ENR |= (1<<8);                                     // 使能ADC1时钟
RCC->AHB1ENR |= (1<<0);                                     // 使能PORTA时钟   
GPIO_Set(GPIOA, PIN1, GPIO_MODE_AIN, 0, 0, GPIO_PUPD_PU); // PA1,模拟输入,下拉   
RCC->APB2RSTR |= (1<<8);                                    // ADCs复位
RCC->APB2RSTR &= ~(1<<8);                                 // 复位结束  
ADC->CCR = (1<<16);                                   // ADCCLK=PCLK2/4=90/4=22.5Mhz,ADC时钟最好不要超过36Mhz
  //ADC->CCR |= (1<<23);                                  // 使能内部温度传感器

ADC1->CR1 = 0;                                      // CR1设置清零
ADC1->CR2 = 0;                                      // CR2设置清零
ADC1->CR1 |= (0<<24);                                       // 12位模式
ADC1->CR1 |= (0<<8);                                     // 非扫描模式

ADC1->CR2 &= ~(1<<1);                                     // 单次转换模式
  ADC1->CR2 &= ~(1<<11);                                    // 右对齐
ADC1->CR2 |= (0<<28);                                     // 软件触发

ADC1->SQR1 &= ~(0XF<<20);
ADC1->SQR1 |= (0<<20);                                      // 1个转换在规则序列中 也就是只转换规则序列1      

    // 设置通道1的采样时间
ADC1->SMPR2 &= ~(7<<(3*1));                              // 通道1采样时间清空   
  ADC1->SMPR2 |= (7<<(3*1));                            // 通道1  480个周期,提高采样时间可以提高精确度
// ADC1->SMPR1 &= ~(7<<(3*(18-10)));                           // 清除通道18原来的设置  
// ADC1->SMPR1 |= (7<<(3*(18-10)));                            // 通道18 480周期,提高采样时间可以提高精确度

  ADC1->CR2 |= (1<<0);                                     // 开启AD转换器   
}
//获得ADC值
//ch:通道值 0~18
//返回值:转换结果
u16 Get_Adc(u8 ch)   
{
// 设置转换序列      
ADC1->SQR3 &= 0XFFFFFFE0;                                   // 规则序列1 通道ch
ADC1->SQR3 |= ch;           
ADC1->CR2 |= (1<<30);                                       // 启动规则转换通道
while (!(ADC1->SR& (1<<1)));                                // 等待转换结束      
return ADC1->DR;                                      // 返回adc值
}
//获取通道ch的转换值,取times次,然后平均
//ch:通道编号
//times:获取次数
//返回值:通道ch的times次转换结果平均值
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for (t=0; t<times; t++)
{
  temp_val += Get_Adc(ch);
  delay_ms(5);
}
return temp_val/times;
}  
调用这三个函数就能使用429的ADC了,哈哈

使用特权

评论回复
沙发
renzheshengui| | 2020-12-3 12:34 | 只看该作者
这个adc配置成什么采样模式了啊

使用特权

评论回复
板凳
wakayi| | 2020-12-3 12:35 | 只看该作者
这个代码是自己写的

使用特权

评论回复
地板
wowu| | 2020-12-3 12:37 | 只看该作者
HAL库用习惯了是非常方便的

使用特权

评论回复
5
xiaoqizi| | 2020-12-3 12:39 | 只看该作者
多通道采集怎么办呢

使用特权

评论回复
6
木木guainv| | 2020-12-3 12:40 | 只看该作者
还需要对相应的输入输出接口进行配置

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1097

主题

4677

帖子

11

粉丝