一个通用的CS1237驱动库
- 这是一个异步获取数据的库,需要每1ms调用一次CS1237_Ref(),以获取新的数据
- 暂时只支持单路CS1237,后续可能会更新多路支持
- 理论上支持所有控制芯片,只需要移植CS1237_bsp.c文件的内容
- 注意_CS1237_ms(uint32_t ms)和_CS1237_Delay()函数的移植
- 移植CS1237_bsp.c文件的内容,让其适配您使用的处理器
- 调用CS1237_Init函数,将CS1237芯片初始化
- 调用CS1237_Start函数,让芯片上电,并且开始采集数据
- 调用CS1237_GetData函数,返回当前采集到的电压值
- (可选)调用CS1237_Finish函数,让CS1237芯片进入掉电模式
C文件如下:
// main.c
#include <CS1237/CS1237.h>
#include "debug.h"
/* Global typedef */
/* Global define */
/* Global Variable */
void tim2_init()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Prescaler = SystemCoreClock / 1000000 - 1;
TIM_TimeBaseInitStruct.TIM_Period = 1000;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStruct);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
GPIO_Init(GPIOA, &GPIO_InitStruct);
TIM_Cmd(TIM2, ENABLE);
}
/*********************************************************************
* @fn main
*
* @brief Main program.
*
* @return none
*/
int main(void)
{
double data = 0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
tim2_init();
Delay_Init();
USART_Printf_Init(115200);
printf("SystemClk:%d\r\n", SystemCoreClock);
CS1237_InitTypedef CS1237_InitStruct;
CS1237_InitStruct.CS1237_Channel = CS1237_Channel_A;
CS1237_InitStruct.CS1237_PGA = CS1237_PGA_1;
CS1237_InitStruct.CS1237_REFO = CS1237_REFO_DISABLE;
CS1237_InitStruct.CS1237_Speed = CS1237_Speed_10Hz;
if(CS1237_Init(&CS1237_InitStruct) == 0)
{
printf("初始化超时!\r\n");
while(1);
}
Delay_Ms(2);
CS1237_Start();
while(1)
{
data = CS1237_GetData();
printf("当前电压:%.5lf\r\n",data);
Delay_Ms(100);
}
}
定时中断内容:
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update))
{
CS1237_Ref();
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
- 温度计算功能
- 多路CS1237功能
- 滤波算法