uint8_t pos = adc_value / 1365;这个代码的参数是怎么来的
时间: 2024-05-21 17:13:18 浏览: 7
这个代码的参数 1365 是根据 ADC 的量程决定的,假设 ADC 的量程为 0-5V,分辨率为 12 位,那么最大的 ADC 值为 4095 (2的12次方减1),因此,5V 对应的 ADC 值为 4095,那么每个单位电压对应的 ADC 值就是 4095/5=819.所以,1365是根据每个单位电压对应的 ADC 值计算得出的,即 5/3*819=1365。
相关问题
#include "bflb_adc.h" #include "bflb_mtimer.h" #include "board.h" struct bflb_device_s adc; #define TEST_ADC_CHANNELS 2 #define TEST_COUNT 10 struct bflb_adc_channel_s chan[] = { { .pos_chan = ADC_CHANNEL_2, .neg_chan = ADC_CHANNEL_GND }, { .pos_chan = ADC_CHANNEL_GND, .neg_chan = ADC_CHANNEL_3 }, }; int main(void) { board_init(); board_adc_gpio_init(); adc = bflb_device_get_by_name("adc"); / adc clock = XCLK / 2 / 32 */ struct bflb_adc_config_s cfg; cfg.clk_div = ADC_CLK_DIV_32; cfg.scan_conv_mode = true; cfg.continuous_conv_mode = false; cfg.differential_mode = true; cfg.resolution = ADC_RESOLUTION_16B; cfg.vref = ADC_VREF_3P2V; bflb_adc_init(adc, &cfg); bflb_adc_channel_config(adc, chan, TEST_ADC_CHANNELS); for (uint32_t i = 0; i < TEST_COUNT; i++) { bflb_adc_start_conversion(adc); while (bflb_adc_get_count(adc) < TEST_ADC_CHANNELS) { bflb_mtimer_delay_ms(1); } for (size_t j = 0; j < TEST_ADC_CHANNELS; j++) { struct bflb_adc_result_s result; uint32_t raw_data = bflb_adc_read_raw(adc); printf("raw data:%08x\r\n", raw_data); bflb_adc_parse_result(adc, &raw_data, &result, 1); printf("pos chan %d,neg chan %d,%d mv \r\n", result.pos_chan, result.neg_chan, result.millivolt); } bflb_adc_stop_conversion(adc); bflb_mtimer_delay_ms(100); } while (1) { } }根据以上代码对bl618程序的编写对以下stm32中代码#include "stm32f10x.h" #include "delay.h" #include "FSR.h" #include "usart.h" #include "adc.h" #define PRESS_MIN 20 #define PRESS_MAX 6000 #define VOLTAGE_MIN 150 #define VOLTAGE_MAX 3300 u8 state = 0; u16 val = 0; u16 value_AD = 0; long PRESS_AO = 0; int VOLTAGE_AO = 0; long map(long x, long in_min, long in_max, long out_min, long out_max); int main(void) { delay_init(); NVIC_Configuration(); uart_init(9600); Adc_Init(); delay_ms(1000); printf("Test start\r\n"); while(1) { value_AD = Get_Adc_Average(1,10); VOLTAGE_AO = map(value_AD, 0, 4095, 0, 3300); if(VOLTAGE_AO < VOLTAGE_MIN) { PRESS_AO = 0; } else if(VOLTAGE_AO > VOLTAGE_MAX) { PRESS_AO = PRESS_MAX; } else { PRESS_AO = map(VOLTAGE_AO, VOLTAGE_MIN, VOLTAGE_MAX, PRESS_MIN, PRESS_MAX); } printf("ADÖµ = %d,µçѹ = %d mv,ѹÁ¦ = %ld g\r\n",value_AD,VOLTAGE_AO,PRESS_AO); delay_ms(500); } } long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }移植到bl618进行改写
以下是将上述STM32代码移植到BL618进行改写后的代码:
```c
#include "bl602.h"
#include "bl_adc.h"
#include "bl_gpio.h"
#include "bl_mtimer.h"
#include "stdio.h"
#define PRESS_MIN 20
#define PRESS_MAX 6000
#define VOLTAGE_MIN 150
#define VOLTAGE_MAX 3300
#define ADC_CHANNEL 0
#define ADC_CLK_DIV 5
#define ADC_RESOLUTION ADC_RESOLUTION_12B
#define ADC_VREF ADC_VREF_3V3
long map(long x, long in_min, long in_max, long out_min, long out_max);
int main(void)
{
bl_mtimer_init();
bl_gpio_enable_output(PIN_11, 1);
bl_adc_init();
bl_adc_config_t cfg = {
.inputMode = ADC_INPUT_SINGLE_END_MODE,
.input = ADC_INPUT_CH0,
.clkDiv = ADC_CLK_DIV,
.resolution = ADC_RESOLUTION,
.refSel = ADC_VREF,
};
bl_adc_channel_config(ADC_CHANNEL, &cfg);
printf("Test start\r\n");
while (1)
{
bl_adc_start();
while (!bl_adc_fifo_data_count())
{
bl_mtimer_delay_us(100);
}
uint16_t value_AD = bl_adc_read_fifo_data();
int VOLTAGE_AO = map(value_AD, 0, 4095, 0, 3300);
long PRESS_AO = 0;
if (VOLTAGE_AO < VOLTAGE_MIN)
{
PRESS_AO = 0;
}
else if (VOLTAGE_AO > VOLTAGE_MAX)
{
PRESS_AO = PRESS_MAX;
}
else
{
PRESS_AO = map(VOLTAGE_AO, VOLTAGE_MIN, VOLTAGE_MAX, PRESS_MIN, PRESS_MAX);
}
printf("AD value = %d, voltage = %d mV, pressure = %ld g\r\n", value_AD, VOLTAGE_AO, PRESS_AO);
bl_mtimer_delay_us(500000);
}
}
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
```
在BL618中,需要使用`bl_adc_init()`进行ADC模块的初始化,并通过`bl_adc_channel_config()`配置ADC通道。需要注意的是,BL618的ADC模块不支持差分模式,因此需要将原来的差分模式改为单端模式。在进行ADC转换时,可以使用`bl_adc_start()`触发转换,并通过`bl_adc_fifo_data_count()`和`bl_adc_read_fifo_data()`获取转换结果。此外,由于BL618中没有提供延时函数,需要使用`bl_mtimer_delay_us()`进行延时。
请你编写一段ADC驱动步进电机的代码
好的,以下是一段ADC驱动步进电机的代码:
```c
#include <stdio.h>
#include <stm32f10x.h>
#define STEPPER_GPIO_PORT GPIOA
#define STEPPER_GPIO_PIN1 GPIO_Pin_8
#define STEPPER_GPIO_PIN2 GPIO_Pin_9
#define STEPPER_GPIO_PIN3 GPIO_Pin_10
#define STEPPER_GPIO_PIN4 GPIO_Pin_11
#define ADC_GPIO_PORT GPIOB
#define ADC_GPIO_PIN GPIO_Pin_0
#define ADC1_DR_Address ((u32)0x4001244C)
__IO uint16_t ADCConvertedValue;
static uint8_t stepper_pos = 0; // 当前步进电机位置
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
// 使能ADC GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
// 配置ADC通道和GPIO
GPIO_InitStructure.GPIO_Pin = ADC_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(ADC_GPIO_PORT, &GPIO_InitStructure);
// 配置ADC
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
// 配置DMA
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 1;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
// 使能DMA
DMA_Cmd(DMA1_Channel1, ENABLE);
// 使能ADC
ADC_Cmd(ADC1, ENABLE);
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);
// 使能ADC DMA
ADC_DMACmd(ADC1, ENABLE);
// 开始转换
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
void Stepper_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置GPIO
GPIO_InitStructure.GPIO_Pin = STEPPER_GPIO_PIN1 | STEPPER_GPIO_PIN2 | STEPPER_GPIO_PIN3 | STEPPER_GPIO_PIN4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(STEPPER_GPIO_PORT, &GPIO_InitStructure);
}
void Set_Stepper_Pos(uint8_t pos)
{
static uint8_t table[] = {0x01, 0x02, 0x04, 0x08};
uint8_t i = 0;
// 设置步进电机
for (i = 0; i < 4; i++)
{
if (pos == i)
{
GPIO_SetBits(STEPPER_GPIO_PORT, table[i]);
}
else
{
GPIO_ResetBits(STEPPER_GPIO_PORT, table[i]);
}
}
stepper_pos = pos;
}
void Delay(uint32_t nCount)
{
uint32_t i = 0;
for (i = 0; i < nCount; i++)
;
}
int main(void)
{
ADC_Configuration();
Stepper_GPIO_Configuration();
while (1)
{
// 获取ADC转换值
uint16_t adc_value = ADCConvertedValue;
// 计算步进电机位置
uint8_t pos = adc_value / 1365;
// 设置步进电机位置
if (pos != stepper_pos)
{
Set_Stepper_Pos(pos);
}
// 延时
Delay(50000);
}
}
```
希望对您有所帮助!
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)